1. 程式人生 > >資料庫超時空閒失效-dbcp連線池引數優化

資料庫超時空閒失效-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的總和應小於 資料庫設定的 超時空閒失效時間