2013-01-16 140 views
0

我正在使用C3P0連接池。我添加了一個擴展C3P0ConnectionProvider的類TestConnectionProvider。我想要的是,在發現異常之後,Hibernate仍然應該嘗試重新連接。但是,捕捉異常後,應用程序停止。重新連接到休眠的問題

序列如下1)MySQL連接已停止2)Hibernate嘗試重新連接多次。 3)我開始MySQL連接。 4)Hibernate獲取連接並開始插入數據。 5)我再次停止了連接。 6)現在Hibernate會拋出我的應用程序沒有捕獲到的異常。

我想要實現的是每當Hibernate失去連接時,應該由應用程序的異常處理機制來處理,並且仍然嘗試重新連接連接在啓動或中間時是否不可用。

回答

0

我假設您沒有提到在執行長時間運行的Hibernate事務時發生的錯誤。

如果是的話,解決方案與您的連接池不直接相關。您需要捕捉異常(確切地說是您要說的地方,但可能在您開始交易的級別),回滾交易並繼續嘗試,直到您成功(即開始新的交易)。您提到您的連接池的事實似乎表明,您在使用c3p0重新連接設置時遇到問題。

這裏是我的休眠連接參數(從屬性文件,你的可能是XML)...

... 
hibernate.dialect=org.hibernate.dialect.MySQLDialect 
hibernate.connection.driver_class=com.mysql.jdbc.Driver 
hibernate.connection.url=jdbc:mysql://localhost/db 
hibernate.connection.username=user 
hibernate.connection.password=password 
hibernate.connection.provider_class=org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider 
hibernate.c3p0.minPoolSize=3 
hibernate.c3p0.maxPoolSize=200 
hibernate.c3p0.maxStatements=100 
hibernate.c3p0.testConnectionOnCheckout=true 
hibernate.c3p0.idleConnectionTestPeriod=300 
... 

注意C3P0參數testConnectionOnCheckoutidleConnectionTestPeriod。更多關於它們的信息hereThis post也有關係。

如果您正確關閉了Hibernate會話(並因此將連接釋放回連接池中),這些設置將允許您在應用程序運行時處理丟失的數據庫連接。

如果在添加這些配置設置並且數據庫連接仍然不具有彈性後,請在日誌中進行雙重檢查,以確保您實際上正在初始化c3p0池。你應該看到這個(你設置log4j.logger.com.mchange.v2=INFO後)...

INFO 2013年1月17日11:14:18832 [主] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource:初始化C3P0池.. 。

同時檢查你是否正確關閉你的Hibernate會話,當你完成它們。您可以使用「性能」測試來檢查此問題,該測試一次打開許多休眠會話(如果您正在構建Web應用程序,可能會一次發送多個HTTP請求),並且在MySQL控制檯中使用show processlist(請參閱here更多信息)。

如果進程列表不斷增長,您沒有正確釋放連接,地球上沒有連接池可以爲您節省。