我假設您沒有提到在執行長時間運行的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參數testConnectionOnCheckout
和idleConnectionTestPeriod
。更多關於它們的信息here。 This 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更多信息)。
如果進程列表不斷增長,您沒有正確釋放連接,地球上沒有連接池可以爲您節省。
來源
2013-01-17 01:59:03
djb