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

問題描述:           mysql dba在mysql服務端啓用了鏈接在空閒必定時間 (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的總和應小於 數據庫設置的 超時空閒失效時間。
相關文章
相關標籤/搜索