考慮因素
1:當前連線DB的規模 2:併發情況 3:執行db的響應時間
配置考慮
1:初始化連線:可考慮設定為3個連線 。對於db規模特別大的情況下可考慮設定為1個。避免啟動時間過長;
2:最小連線:可考慮該值的設定和初始化連線保持一致;
3:最大連線:對於有較大DB規模,最大連線不要設定過大,避免本地維護的db太大。 如果對應到資料來源的併發數過高,可考慮增大最大連線數。
4:獲取連線的超時時間:如果連線全部被佔用,需要等待的時間。可以根據當前系統的響應時間判定,如果容忍度較高,可以大點。容忍度較低,設定小點。
5:當獲取連線和釋放連線心跳檢測:建議全部關閉,否則每個資料庫訪問指令會對資料庫生產額外的兩條心跳檢測的指令,增加資料庫的負載。連線有效性的檢查改用後臺空閒連線檢查。
6:連線有效性檢測時間:該值需要結合資料庫的wait_timeout,interactive_timeout值進行設定。假如資料庫為120s,則心跳檢測時間在120s以內越大越好。如果太小,心跳檢測時間會比較頻繁。建議設定為90s。
7:最大空閒時間:如果連線超過該時間沒有使用過,則會進行close掉。 該值不要太小,避免頻繁的建立連線關閉連線。也不要太大,導致一直無法關閉。
8:心跳檢查的sql語句:儘量使用ping命令,ping的效能較查詢語句高。大部分的資料庫連線池不配置query語句,便會呼叫ping命令。
9:prepareStatement快取:可以根據自己的業務來判定是否開啟。開啟後對效能的影響依賴於具體業務和併發情況。可考慮暫時不開啟。
10:連線使用超時:業務拿到一個連線,如果超過指定的時間未歸還,是否把該連線給給回收掉。超時時間等和具體的業務關聯。暫時建議先不開啟。
下面主要給出:druid,dbcp,c3p0 三種連線池的推薦配置
druid配置
介紹:https://github.com/alibaba/druid
推薦配置:
initialSize | 3 | 初始化配置 |
minIdle | 3 | 最小連線數 |
maxActive | 15 | 最大連線數 |
maxWait | 5000 | 獲取連線超時時間(單位:ms) |
timeBetweenEvictionRunsMillis | 90000 | 連線有效性檢測時間(單位:ms) |
testOnBorrow | false | 獲取連線檢測 |
testOnReturn | false | 歸還連線檢測 |
minEvictableIdleTimeMillis | 1800000 | 最大空閒時間(單位ms) |
testWhileIdle | true | 在獲取連線後,確定是否要進行連線空間時間的檢查 |
配置說明:
1:minEvictableIdleTimeMillis(最大空閒時間):預設為30分鐘,配置裡面不進行設定。
2:testOnBorrow ,testOnReturn 預設為關閉,可以設定為不配置。
3:testWhileIdle(在獲取連線後,確定是否要進行連線空閒時間的檢查)。預設為true。配置裡面不再進行設定。
流程說明:
1:在第一次呼叫connection的時候,才會進行 initialSize的初始化。
2:心跳檢測時間執行緒,會休眠timeBetweenEvictionRunsMillis時間,然後只對(沒有borrow的執行緒 減去 minIdle)的執行緒進行檢查,如果空閒時間大於minEvictableIdleTimeMillis則進行close。
3:testWhileIdle必須設定為true,在獲取到連線後,先檢查testOnBorrow,然後再判定testwhileIdle,如果連線空閒時間大於timeBetweenEvictionRunsMillis,則會進行心跳檢測。
4:不需要配置validationQuery,如果不配置的情況下會走ping命令,效能更高。
5:連線儲存在陣列裡面,獲取連線的時候,獲取陣列的最後一位。在timeBetweenEvictionRunsMillis時是從前往後進行檢查連線的有效性。
dbcp配置
介紹:http://commons.apache.org/proper/commons-dbcp/configuration.html
推薦配置:
引數 | 配置 | 說明 |
initialSize | 3 | 初始化配置 |
minIdle | 3 | 最小連線數 |
maxIdle | 15 | 最大空閒連線 |
maxTotal |
15 | 最大連線數 |
maxWaitMillis | 5000 | 獲取連線超時時間(單位ms) |
timeBetweenEvictionRunsMillis | 90000 | 心跳檢測時間(單位ms) |
minEvictableIdleTimeMillis | 1800000 | 最大空閒時間(單位ms) |
testOnBorrow | FALSE | 獲取連線檢測 |
testOnReturn | FALSE | 歸還連線檢測 |
numTestsPerEvictionRun | -1 | 空閒連線檢查的個數 |
testWhileIdle | TRUE | 是否開啟對空閒連線的檢查 |
配置說明:
1:關於maxidle和maxTotal儘量保持一致。
2:numTestsPerEvictionRun 設定為-1,代表對所有的連線均進行檢查。預設值為3。-1代表對全部idle的連線檢查有效性。 否則有可能造成部分連線的有效性未進行檢查。
3:testWhileIdle 也必須為true,代表需要檢查有效性。
4:minEvictableIdleTimeMillis預設值為30分鐘,可以不用進行設定。
5:testOnReturn預設值為false,可以不用設定。但是testOnBorrow必須進行設定為false,預設值為true。
6:validationQuery不配置預設走ping命令
流程說明:
1:在第一次呼叫connection的時候,才會進行 initialSize的初始化。
2:不需要配置validationQuery,如果不配置的情況下會走ping命令,效能更高。
3:連線儲存在LinkedBlockingDeque 中。來做併發的控制。
4:後端會有一個定時任務,間隔為timeBetweenEvictionRunsMillis,先確定需要對多少執行緒進行檢測(numTestsPerEvictionRun控制),然後判定是否超過minEvictableIdleTimeMillis,如果超過則close掉。沒有超過,則判定testWhileIdle為true的話,進行心跳檢查。如果檢查失敗則關閉連線。
5:在return連線的時候會判定maxIdle,如果當前空閒連線是否大於maxIdle,則會關閉掉連線。
c3p0配置
介紹: http://www.mchange.com/projects/c3p0/
推薦配置:
引數 | 推薦值 | 說明 |
initialPoolSize | 3 | 初始化配置 |
minPoolSize | 3 | 最小連線數 |
maxPoolSize | 15 | 最大連線數 |
acquireIncrement | 1 | 每次獲取的個數 |
checkoutTimeout | 5000 | 獲取連線超時時間(單位ms) |
idleConnectionTestPeriod | 90 | 心跳檢測時間(單位 s) |
maxIdleTime | 1800 | 最大空閒時間(單位 s) |
testConnectionOnCheckout | FALSE | 獲取連線檢測 |
testConnectionOnCheckin | FALSE | 歸還連線檢測 |
numHelperThreads |
1 |
配置說明:
1:testConnectionOnCheckout和testConnectionOnCheckin預設為false,可不用配置
2:preferredTestQuery不用配置,預設走ping命令。
3:numHelperThreads 預設是開啟3個執行緒。如果資料來源較多,這裡會存在較多執行緒。 這裡設定為1,避免執行緒較多的情況。
流程說明:
1:在第一次呼叫connection的時候,才會進行 initialPoolSize的初始化。
2:在進行心跳檢測的時候,會對所有的空閒連線進行心跳檢測。如果發現總連線小於最小連線數,則會建立連線,保持最小的連線數。