1. 程式人生 > >[轉載]跟蹤 c3p0 連線池連線洩漏

[轉載]跟蹤 c3p0 連線池連線洩漏

最近的專案碰到了連線洩漏的問題。 專案用的是Spring + Hibernate + c3p0,具體表現為,系統

執行一段時間後,使用者開啟登入頁後,執行登入無響應,檢視後臺日誌,提示Could not open

Connection。將c3p0日誌級別調成debug之後,發現c3p0報告連線數已經達到設定的上限。 之前檢

查連線洩漏時,使用的是極低效的辦法,目測程式碼,所以問題解決起來頗費周折,效果還不好。 今

天查了一下c3p0官方手冊,c3p0官方提供了兩個引數,能夠很方便的檢查沒有正確返回連線池的連

接。
 
debugUnreturnedConnectionStackTraces
 預設為false,如果此引數設定為true,當所有連線用完的時候,會以堆疊資訊顯示哪些程式碼使用

了連線。由於跟蹤連線狀態會產生額外的消耗,如果程式穩定,應該將此引數恢復為預設值false。
 
unreturnedConnectionTimeout
 設定連線被checkout後,經過多長時間還未返還連線池,則連線緩衝池直接Kill該連線,此時,結

合debugUnretrunedConnectionStackTraces,我們可以知道是什麼程式持有了連線,並且沒有返回

。這個方法很暴力,有可能造成應用程式不穩定,所以,如果真的出現了連線洩漏,一時半會又找

不到問題點所在,可以暫時使用這個方法讓應用程式跑起來。
 
參考:c3p0官方手冊