我們有一個使用c3p0庫的服務,我們已經添加了這個屬性unreturnedConnectionTimeout來確保未返回的連接正在超時,但顯然c3p0沒有拋出異常,而只是打印異常堆棧跟蹤,當我把debugUnreturnedConnectionStackTraces屬性真正。c3p0 unreturnedConnectionTimeout沒有拋出異常
在這種情況下,我們的服務線程正在等待c3p0庫永遠因爲沒有例外而等待連接。
你能給我們一個解決方案如何處理這種情況?
我們有一個使用c3p0庫的服務,我們已經添加了這個屬性unreturnedConnectionTimeout來確保未返回的連接正在超時,但顯然c3p0沒有拋出異常,而只是打印異常堆棧跟蹤,當我把debugUnreturnedConnectionStackTraces屬性真正。c3p0 unreturnedConnectionTimeout沒有拋出異常
在這種情況下,我們的服務線程正在等待c3p0庫永遠因爲沒有例外而等待連接。
你能給我們一個解決方案如何處理這種情況?
您是誤解unreturnedConnectionTimeout
。
投擲unreturnedConnectionTimeout
沒有例外。如果設置正確,只有在泄露連接時纔有效。某些客戶端已檢出連接並無法將其重新檢入。未發生異常。沒有客戶受到此影響,除非是間接的,因爲現在有更少的連接可用於檢出。 c3p0只是殺死未歸還的Connection。沒有人通知這件事。
如果您的客戶端無限期地等待連接,那聽起來您的連接泄漏沒有被unreturnedConnectionTimeout
清除,或者更可能是您發現連接等待超時的時間過長,無法接受你已經設定好了。
你應該做的事情是看看那些被記錄的堆棧軌跡,假設你有debugUnreturnedConnectionStackTraces
設置爲true
。這些堆棧跟蹤不代表異常(儘管它們可能會打印爲「DEBUG」異常) - 但是它們會顯示檢出從未返回的Connections的代碼路徑。修復這個問題,修復連接泄漏問題,所有問題都會消失。查看Connection如何檢出,在代碼中找到,並確保在某些finally
塊中不會關閉任何已檢出的Connection,或者通過try-with-resources可以更容易地在Java 7後面關閉。