考慮因素
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:在進行心跳檢測的時候,會對所有的空閑連接進行心跳檢測。如果發現總連接小於最小連接數,則會創建連接,保持最小的連接數。
轉載:https://blog.csdn.net/wangxintong_1992/article/details/80768210