2009-10-15 45 views
3

我有一個Java Web應用程序連接到在另一臺機器上運行的Oracle數據庫(不確定這是否相關)。我正在使用DBCP進行連接池。 Web應用程序在JBoss 4.2.2中運行,我們在Spring中將我們的數據源定義爲一個bean。使用Oracle DB在Java Web應用程序中超過最大空閒時間

我們使用Hibernate for ORM。

偶爾會出現如下錯誤:「ORA-02396:超出最大空閒時間,請重新連接」。

我曾嘗試將屬性添加到我們的DBCP BasicDataSource名爲「removeAbandoned」(true)和「removeAbandondedTimeout」(120)無濟於事。

任何幫助,將不勝感激。如果我需要提供更多的信息,請告訴我 - 我並不全都知道連接池的內部工作等等。

回答

7

嘗試在配置數據源時將testWhileIdle屬性設置爲true。你還需要一個測試查詢 - 對於Oracle,像select 1 from dual就足夠了。

這將提示dbcp推動任何空閒連接以保持新鮮。

如果您以後不需要重新創建它們,您也可以考慮將連接變爲空閒狀態。請查看描述minEvictableIdleTimeMillis,timeBetweenEvictionRunsMillismaxIdle/minIdle屬性的配置選項的documentation

0

spring forums上查看此線程。

在使用者要麼最終切換到C3P0或添加testWhileIdle屬性到彈簧配置:

<prop key="hibernate.dbcp.testWhileIdle">true</prop> 

<prop key="hibernate.dbcp.validationQuery"> 
select 1 from dual 
</prop> 
+1

可能是值得指出的彈簧論壇海報 - 這就是潛在的不安全的驗證查詢。如果abc中有很多行,你不想運行它。 – serg10 2009-10-15 17:24:59

0

我會切換到Oracle通用連接池庫。它針對Oracle JDBC連接進行了優化,但如果您切換,也可以與任何JDBC驅動程序一起使用。它也符合JDBC 4.0,並且正在進行中。 C3P0,Proxool,DBCP都是停滯不前的。它會通過對Oracle執行ping來驗證連接,而不是查詢也更快。

Oracle UCP

+0

UCP是否可用於10g? – Rintoul 2009-10-15 20:14:24

+0

是的,它適用於任何具有有效JDBC驅動程序實現的數據庫。如果您碰巧使用Oracle驅動程序,只需使用一些特殊的技巧。 – Gandalf 2009-10-15 20:15:06

相關問題