【发布时间】:2011-01-18 16:36:01
【问题描述】:
有人知道重新建立/重试休眠连接的方法吗?例如:远程数据库已关闭,我启动了我的应用程序。 Hibernate 无法建立连接。它失败。但是应用程序没有关闭。有没有办法让休眠状态再次尝试建立连接?
提前致谢
【问题讨论】:
有人知道重新建立/重试休眠连接的方法吗?例如:远程数据库已关闭,我启动了我的应用程序。 Hibernate 无法建立连接。它失败。但是应用程序没有关闭。有没有办法让休眠状态再次尝试建立连接?
提前致谢
【问题讨论】:
你真的应该去 C3P0 连接池:http://www.mchange.com/projects/c3p0/index.html#hibernate-specific
C3P0 文档中有一个关于该主题的部分:http://www.mchange.com/projects/c3p0/index.html#configuring_recovery
首先您必须正确配置 c3p0,如果使用 hibernate,则必须在 c3p0.properties 文件中进行配置。
在您的 c3p0.properties 中放置这些属性,以便在数据库关闭时每 3 秒无限期地重新连接:
c3p0.acquireRetryAttempts = 0
c3p0.acquireRetryDelay = 3000
c3p0.breakAfterAcquireFailure = false
此外,为避免断开连接无限期地躺在您的池中,请使用连接年龄管理:
c3p0.maxConnectionAge = 6000
c3p0.maxIdleTime = 6000
c3p0.maxIdleTimeExcessConnections = 1800
c3p0.idleConnectionTestPeriod = 3600
这些可能非常昂贵,但如果以上还不够,则很有帮助:
c3p0.testConnectionOnCheckout = true
c3p0.preferredTestQuery = SELECT 1;
您可能还想检查阻止恢复的连接泄漏:
c3p0.debugUnreturnedConnectionStackTraces = true
最后,确保 C3P0 正确连接到休眠状态,启用“com.mchange”包的调试日志,看看 C3P0 是否告诉你任何关于它自己的信息。它应该说明加载的配置属性,所以看看它是否都在那里。
我希望这会有所帮助。
【讨论】:
C3P0 是休眠的内部连接池实现。
添加“hibernate.connection.provider_class= org.hibernate.connection.C3P0ConnectionProvider” 在休眠属性文件中。创建一个文件 c3p0.properties 相应地设置参数。此文件和 c3p0-x.jar 必须在类路径中。
c3p0.properties
c3p0.idleConnectionTestPeriod:如果这是一个大于 0 的数字,c3p0 将每隔这个秒数测试所有空闲的、池化但未签出的连接。
c3p0.testConnectionOnCheckout:仅在必要时使用。昂贵的。如果为 true,将在每次连接检查时执行操作以验证连接是否有效。更好的选择:使用 idleConnectionTestPeriod 定期验证连接。
还有其他几个属性可以在 hibernate.properties & c3p0.properties 中配置。
【讨论】:
可能,您尝试调用方法 .getCurrentSession() 而不是 .openSession()?
如果连接中断,您必须建立新的。
我希望这会有所帮助。
【讨论】: