恢复Hibernate连接

6

有人知道重新建立/重试Hibernate连接的方法吗?比如说:远程数据库宕机,我启动我的应用程序。Hibernate无法建立连接,失败了。但是应用程序没有关闭。有没有办法让Hibernate再尝试一次建立连接呢?

提前感谢。

3个回答

19
你应该真正选择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和Hibernate正确连接,为“com.mchange”包启用调试日志,并查看C3P0是否会告诉您有关自身的任何信息。 它应该声明加载的配置属性,因此请检查是否全部存在。

希望这可以帮到你。


1

C3P0是Hibernate的内部连接池实现。

在Hibernate属性文件中添加“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中配置。


是的,这是我的第一步。但它没有起作用。我做了你所说的一切,但没有结果。如果数据库关闭,C3p0连接池测试器不会被调用。如果数据库正在工作,并且我在测试器也在工作时启动应用程序并且看到它能够检查连接状态,但我想知道如果数据库关闭该怎么办。我的意思是应用程序尝试创建连接池,但失败了,过一段时间后它将再次尝试。 - Andrey
如果您的数据库宕机,它将重试 acquireRetryAttempts 次,每次尝试之间有 acquireRetryDelay 的延迟,之后可能会导致异常。 - Nayan Wadekar
是的,这就是我看到的。Hibernate 尝试重新连接 acquireRetryAttempts 次,每次延迟 acquireRetryDelay,但之后没有异常。我不明白如何判断 Hibernate 是否已连接到数据库。 - Andrey
实现ConnectionTester用于连接验证- http://www.mchange.com/projects/c3p0/apidocs/index.html 并在那里处理异常。否则您必须通过c3p0实现并构建自己的PooledDataSource,请参阅文档- http://www.mchange.com/projects/c3p0/index.html - Nayan Wadekar

0

可能是你尝试调用方法.openSession()而不是.getCurrentSession()

如果连接断开,你必须建立新的连接。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接