2011-09-13 107 views
1

可以恢復由於數據庫不可用而關閉的jdbc連接。可以恢復jdbc連接嗎?

爲了回饋我接下來的錯誤順序。它看起來不是手動重新啓動。我的問題的原因是,我被告知,該應用程序正常運行沒有 重新啓動。因此,如果連接丟失,可以在數據庫重新啓動後恢復。

java.sql.SQLException中:ORA-12537:TNS:連接關閉

java.sql.SQLRecoverableException:ORA-01034:ORACLE不可用 ORA-27101:共享內存境界不存在 IBM AIX RISC系統/ 6000錯誤:2:沒有這樣的文件或目錄

java.sql.SQLRecoverableException:ORA-01033:ORACLE初始化或關機正在進行

+0

與剛剛打開一個新連接相反? – Marvo

+0

您是否在整個應用程序的生命週期中保持連接打開?那很糟。應該在儘可能短的範圍內打開和關閉它們,最好在與執行SQL查詢的位置相同的方法塊內。 – BalusC

+0

不,這不是,他們正在關閉,我確實使用連接池。我在日誌中遇到了異常,並試圖破譯可能發生的事情。請記住,此後應用程序運行良好。希望澄清。 –

回答

3

號的聯繫是 「死」。創建一個新的連接。

一個好方法是使用connection pool,它會在提供給您之前測試連接是否仍然正常,並在需要時自動創建新連接。

有幾個開源連接池可供使用。我用過Apache's JDCP,它對我很有幫助。

編輯:
既然你要等到數據庫回來了,如果它的下跌(有趣的想法),你可以實現的getConnection()定製的版本,「等待了一會兒,再次嘗試」如果數據庫沒有迴應。

p.s.我喜歡這個主意!

+0

在問題 –

+0

中添加了一條評論連接池在這裏沒有幫助;它只會有助於單個數據庫會話崩潰。 – steve

0

連接無法恢復。可以做的是將連接故障轉移到另一個數據庫實例。 RAC和數據保護安裝支持此配置。

這對於只讀事務是沒有問題的。然而,對於執行DML的事務來說,這可能是一個問題,特別是如果最後一次調用DB是提交。在提交的情況下,客戶端無法確定提交調用是否完成。數據庫何時失敗;在執行提交之前,或在執行提交之後(但不將確認發送回客戶端)。只有應用程序具有這種邏輯,才能做正確的事情。如果失敗後的應用程序不驗證上次事務的狀態,則可能發生重複事務。這是一個已知的問題,我們大多數人都經歷過購買門票或類似的網絡交易。