2017-08-24 99 views
2

我目前正在編寫一個Java應用程序,它很大程度上依賴於JDBC和與Oracle數據庫的連接。每當我連接到數據庫時,我都會關閉try-catch塊的finally塊中的連接,以避免連接泄漏。這工作得很好,直到現在。如何在程序崩潰時避免連接泄漏

但是現在我的程序因爲什麼原因而崩潰。在PLSQL Developer中,我仍然可以觀察到一個開放的JDBC瘦客戶端連接。我現在的問題是:如何關閉JDBC連接,當我不得不通過任務管理器殺死我的應用程序?

當然,這個崩潰不應該發生在第一位,但它仍然非常不令人滿意,這導致了連接泄漏,我現在不得不告訴DBA手動殺死JDBC會話,如果太多連接仍然開放。

回答

1

一旦你失去了應用程序層和數據庫層之間的握手,你將遇到一些嚴重的困難,試圖從應用程序層中終止你的數據庫會話。

以高特權,你也許可以做到,你查詢V$SESSION視圖花哨的東西,並設法找到你掛會話,以便您可以發送使用JDBC一些kill命令(注意我說的威力,因爲我不能保證類似的命令存在於JDBC驅動程序中 - 實際上它可能不會)。但我認爲這將是嚴重的矯枉過正。

我認爲你最好的選擇是使用Oracle的會話管理工具從數據庫端解決問題。將您正在連接的用戶配置文件中的IDLE_TIME參數設置爲除UNLIMITED以外的其他值,以便Oracle自動將SNIPES(終止)空閒指定時間段內的任何連接。談談你的DBA一下,他們應該能夠集這件事對你......這是一個相當簡單的調整(但是請記住,你還需要設置TRUERESOURCE_LIMIT數據庫參數來識別任何IDLE_TIME設置。

+0

謝謝,與DBA談論這確實是一個好主意。唯一的問題可能是,只要我的程序運行在我們公司之外(它是一個API測試工具,可能對我們的客戶很有意思),他們會面對同樣的問題,將不得不作出相同的調整他們的數據庫,這可能會使他們懷疑程序的穩定性^^ – Phreneticus

+0

我不會太擔心發送錯誤的信號。設置'IDLE_TIME'是一個很好的連接特別是如果您有大量用戶訪問數據庫時進行聯合練習一羣用戶可以通過打開連接然後離開他們的機器而不關閉程序來輕易地阻止數據庫。 – DanK