數據庫超時空閒失效-dbcp連接池參數優化

問題描述:

          mysql dbamysql服務端啓用了連接在空閒一定時間 (10分鐘後,就自動關閉連接(連接失效)的功能,導致java連接池在空閒一段時間後,連接被自動關閉(自動失效)。爲了避免這種情況出現,可以在dbcp上配置空閒的時候檢測連接池線程功能。

               一些新建的數據庫,DBA設置了超時空閒失效時間(即一個連接超過多長時間空閒,該連接將失效),而我們的很多程序使用的是DBCP連接池

默認參數的情況下連接池是不會自動去檢測某個連接是否失效的。這樣程序如果獲到的是已經失效的鏈接,將會出現報錯。


解決原理:
DBCP使用Apache的ObjectPool作爲Connection Pool的實現,在構造GenericObjectPool的時候,會生成一個Inner Class Evictor,實現Runnable的接口。如果屬性_timeBetweenEvictionRunsMillis > 0,每過_timeBetweenEvictionRunsMillis毫秒後Evictor會調用evict method,檢查Object的idle time是否大於屬性_minEvictableIdleTimeMillis毫秒(如果_minEvictableIdleTimeMillis設置爲<=0則忽略,使用default value 30分鐘),如果是則銷燬該Object

參數說明
timeBetweenEvictionRunsMillis (設置的Evict線程的時間,單位:毫秒,即每隔多少時間去檢測一次空閒連接是否超時,默認值爲-1,即不開啓)
minEvictableIdleTimeMillis (空閒逐出連接池的時間,單位:毫秒,默認30分鐘)
numTestsPerEvictionRun (設定在進行後臺對象清理時,每次檢查幾個鏈接。默認值是3.
如果numTestsPerEvictionRun>=0, 則取numTestsPerEvictionRun 和池內的鏈接數 的較小值 作爲每次檢測的鏈接數
如果numTestsPerEvictionRun<0,則每次檢查的鏈接數是檢查時池內鏈接的總數乘以這個值的負倒數再向上取整的結果。)
舉例:
              XX系統的數據庫Mysql,dba設置的超時空閒失效時間是600秒(MYSQL如果不設置,默認的是8小時),未加以下參數之前經常報鏈接失效的錯誤,加上以下配置後,暫時未發現有錯。timeBetweenEvictionRunsMillis="290000" minEvictableIdleTimeMillis="290000" numTestsPerEvictionRun="20"
              注:timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis的總和應小於 數據庫設置的 超時空閒失效時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章