資料庫連線池優化配置(druid,dbcp,c3p0)

FrankYou發表於2018-09-10

主要描述了資料庫連線池引數配置的準則,針對常用的資料庫連線池(c3p0,dbcp,druid)給出推薦的配置。

考慮因素

        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:在進行心跳檢測的時候,會對所有的空閒連線進行心跳檢測。如果發現總連線小於最小連線數,則會建立連線,保持最小的連線數。

 

相關文章