2011-07-22 241 views
27

java.sql.SQLException的原因:與Oracle關閉的連接?Oracle數據庫:java.sql.SQLException:關閉連接

java.sql.SQLException中:在oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)關閉連接 在oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:1131) at oracle.jdbc.OracleConnectionWrapper.commit(OracleConnectionWrapper.java: 117)

我們從失敗中得到這個錯誤o ver數據庫連接。我們也爲其他數據庫使用相同的代碼。但只有一個數據庫可以看到這個問題。這是因爲連接可能由於長時間不活動而超時,我們正試圖使用​​它?請讓我知道如果你需要更多的細節......

AbandonedConnectionTimeout設置爲15分鐘 InactivityTimeout設置爲30分鐘

回答

32

這意味着連接成功在某種程度上成立,但是當你試圖提交正確的有,連接不再打開。你提到的參數聽起來像連接池設置。如果是這樣,他們與這個問題無關。最可能的原因是您和數據庫之間的防火牆會在一定的空閒時間後終止連接。最常見的修復方法是在連接被檢出時使連接池運行驗證查詢。這將立即識別並驅逐死亡連接,確保您只能從游泳池中獲得良好的連接。

+0

感謝您的回答。驗證連接屬性是否會增加任何開銷?我只看到這個數據庫中的一個,我也懷疑這個數據庫DB有問題。 –

+4

它自然會增加一些開銷,因爲它必須實際地擊中數據庫才能驗證連接;然而,每個數據庫都有一個推薦的「驗證查詢」,因此在數據庫方面的開銷最小,因此,您將得到的唯一減速是來自任何網絡延遲。無論問題出在哪裏,添加驗證查詢都是避免從池中死去的連接的一種非常簡單的方法。我相信目前對Oracle推薦的查詢是'從雙選擇1' –

8

您必須驗證連接。

如果您使用Oracle,您可能會使用Oracle的Universal Connection Pool。以下假設你這樣做。

驗證連接的最簡單方法是告訴Oracle連接在借用時必須經過驗證。這可以通過

pool.setValidateConnectionOnBorrow(true); 

但它只適用於持有短時間的連接。如果您長時間借用連接,連接可能會在您拿着連接時斷開。在這種情況下,你必須與

if (connection == null || !((ValidConnection) connection).isValid()) 

進一步的詳情請參見Oracle documentation明確驗證連接。

+0

如果您不能使用UCP或不想處理公共Maven存儲庫中不存在的Oracle工件令人頭疼的問題,我最近才發現java.sql.Connection有一個isValid方法。它在超時工作。 – obesechicken13

+0

和oracle.ucp.jdbc。ValidConnection的isValid導致我的預定記錄器在java.lang.ClassCastException中崩潰 – obesechicken13