資料庫重連

2021-08-26 13:37:56 字數 1518 閱讀 1801

4.2.10 資料庫自動重連

dbcp使用apache的物件池objectpool作為連線池的實現,在構造genericobjectpool時,會生成乙個內嵌類evictor,實現自runnable介面。如果_timebetweenevictionrunsmillis大於0,每過_timebetweenevictionrunsmillis毫秒evictor會呼叫evict()方法,檢查物件的閒置時間是否大於 _minevictableidletimemillis毫秒(_minevictableidletimemillis小於等於0時則忽略,預設為30分鐘),是則銷毀此物件,否則就啟用並校驗物件,然後呼叫ensureminidle方法檢查確保池中物件個數不小於_minidle。在呼叫returnobject方法把物件放回物件池,首先檢查該物件是否有效,然後呼叫poolableobjectfactory 的passivateobject方法使物件處於非活動狀態。再檢查物件池中物件個數是否小於_maxidle,是則可以把此物件放回物件池,否則銷毀此物件

還有幾個很重要的屬性,_testonborrow、_testonreturn、_testwhileidle,這些屬性的意義是取得、返回物件和空閒時是否進行驗證,檢查物件是否有效,預設都為false即不驗證。所以當使用dbcp時,資料庫連線因為某種原因斷掉後,再從連線池中取得連線又不進行驗證,這時取得的連線實際已經時無效的資料庫連線了。網上很多說dbcp的bug應該都是如此吧,只有把這些屬性設為true,再提供_validationquery語句就可以保證資料庫連線始終有效了,oracle資料庫可以使用select count(*) from dual,不過dbcp要求_validationquery語句查詢的記錄集必須不為空,可能這也可以算乙個小小的bug,其實只要_validationquery語句執行通過就可以了。

舉例:objectpool connectionpool = new genericobjectpool(null, maxactive,

genericobjectpool.default_when_exhausted_action, maxidle,maxwait);

connectionfactory connectionfactory = new drivermanagerconnectionfactory(

"jdbc:jtds:sqlserver://" + hostname +":"+portnum+ "/" + sid,username,password);

((genericobjectpool)connectionpool).settestonborrow(true);//設定取從連線池取的連線前對連線進行測試,保證斷網後連線池能繼續執行。

poolableconnectionfactory poolableconnectionfactory =

new poolableconnectionfactory(connectionfactory, connectionpool,

null, null, false, true);

poolableconnectionfactory.setvalidationquery("select 1");

java中資料庫重連

當資料庫重新啟動,而導致程式無法連線,需要重啟tomcat才能重連的解決辦法 方法一 將連線池由dbcp改為c3p0 c3p0連線池本身具有資料庫重連機制 方法二 資料來源dbcp不變,只要在原來的配置上進行如下修改 1 在配置檔案中每個資料來源增加 2 在xd.properties每個資料來源配置...

mysql ping實現資料庫重連

實際工作中遇到上一次資料庫訪問和下一次資料庫訪問超過wait timeout的情況,此時就會報mysql has gone away的錯誤.利用mysql ping可以解決 1 現在資料庫抽象層加入重連功能 重新連線資料庫 private function reconnect 檢查資料庫連線是否可用...

ADO 資料庫連線斷開重連

在使用ado的過程中,最理想的操作流程 程式啟動,開啟資料庫連線,在程式退出前,一直保持這個連線。程式退出時,才關閉該連。最理想的狀態的前提 該資料庫連線在中間不會斷開。不會由於網路或者資料庫伺服器的原因導致連線斷開。實際情形是 需要開發乙個長時間執行的程式,資料庫伺服器可能在很遠的地方,網路不可靠...