有客戶說,他們通過connection pool監控發現weblogic92連線池中當前連線數(current
capacity)小於初始連線數(initial
capacity)。從現象上來說,給客戶的直覺是:連線池初始化有問題,沒有幫助他們初始化他們需要的那麼多連線。但他同時發現,幾個connection
pool中,其他pool沒有問題。拿到問題,我也懷疑這可能是weblogic的乙個bug,但隨後從客戶傳送過來的日誌中發現出問題的connection被disable過。調查後發現問題的確和這個pool被disable過有關,那麼為什麼pool被disable後,會出現這樣的問題呢?
首先我們看看這個pool為什麼會被disable?
手工強制suspend連線池、資料庫關閉、網路不穩定等因素都可能成為connection
pool被disable的誘因。從客戶的日誌中,我能看到大量的如下異常,
1:j**a.net.socketexception: 管道已斷開
(errno:32)
2:weblogic.common.resourcepool.resourcedisabledexception: pool
jdbc data source-0 is disabled, cannot allocate resources to
根據上面的異常,首先跟客戶確認是否存在過資料庫關閉、強制disable
connection的操作,這些都被客戶否定了,那麼最大可能的原因就是網路不穩定,網路是好時壞的話,很容易造成weblogic連線池中到database
server的連線中斷,從而導致connection pool被disable。
那麼為什麼連線中斷會引起connection
pool被disable呢?這裡要談到兩個引數:countoftestfailurestillflush、countofrefreshfailurestilldisable。這兩個引數在weblogic連線池實現中由於控制是否、何時flush或disable連線池,兩個都是指連續幾次失敗操作(test、refresh)後去flush或disable
connection
pool。注意:這是說的是連續,而不是間斷,每次成功操作(test、refresh)後,這兩個值都會被reset成0。預設情況下這兩個值均為2,即連續失敗3(2+1)次後,connection
pool會被flush或disable。兩者的區別在於,flush用於清空connection
pool中的所有連線(通常都是中斷的connection),當pool狀態仍保持在running狀態,而對於後者,connection
pool將會變成suspend。前者對於客戶端而言,還可以從pool中reserve
connection,reserve時,weblogic會嘗試重現建立連線,如果建立連線成功,那麼客戶端就可以拿到可用的連線。而對於乙個處於suspend狀態,客戶端reserve
connection的請求會直接被拒絕,收到的異常如下:
weblogic.common.resourcepool.resourcedisabledexception:
pool jdbc data source-0 is disabled, cannot allocate resources to
乙個被disable的connection
pool我們需要手工resume嗎?比如資料庫因為某些原因而突發關閉,資料庫恢復後,我們是否需要手工去resume這個pool?不需要,weblogic內部實現了連線池的自我健康檢查功能,對於disable的connection
pool,weblogic會每隔5秒鐘(default_scan_unit)去做一次連線嘗試(嘗試建立乙個物理連線,如果連線成功,那麼這個連線會被直接放入連線池中,我們的問題就處在這兒),我們通過下面的復現過程來看看具體原因:
配置Tomcat 6 0 連線池
start 既然要使用tomcat 6 連線池,那肯定和以前的tomcat 5.5有區別是吧。這裡我比較下幾個方式,並且使用一種比較方便的方式記錄tomcat6連線池配置方式。1 保證tomcat lib有sql驅動包。2 在專案中建立乙個meta inf資料夾。在webcontent下建立。這個資...
Mybatis學習筆記 08 連線池
我們知道,jdbc運算元據庫,建立connection的開銷是十分大的,而mybatis實際上是對jdbc的封裝,還是避免不了建立鏈結帶來的大開銷,不過mybatis內部其實還是整合了自帶的連線池。對於頻繁建立導致的高消耗,我們的處理辦法就是引入連線池機制,所謂連線池,就是我們預先建立一些連線,在使...
JDBC 五 連線池的分類及使用
執行緒池 資料庫連線池都屬於池化技術,為了減少跟作業系統之間的互動次數。dbcp commons collections commons pool commons dbcp 池物件可以放很多 不只放連線 從網上讀取的資料。依賴於集合。dbcp是資料庫連線池 只能放資料庫連線 database con...