【问题标题】:Recover Hibernate connection恢复休眠连接
【发布时间】:2011-01-18 16:36:01
【问题描述】:

有人知道重新建立/重试休眠连接的方法吗?例如:远程数据库已关闭,我启动了我的应用程序。 Hibernate 无法建立连接。它失败。但是应用程序没有关闭。有没有办法让休眠状态再次尝试建立连接?

提前致谢

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    你真的应该去 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 是否告诉你任何关于它自己的信息。它应该说明加载的配置属性,所以看看它是否都在那里。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      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 中配置。

      【讨论】:

      • 是的,这是我的第一步。但它没有用。我做了你所说的一切,但没有结果。如果 DB 关闭,则不会调用 C3p0 连接池测试器。如果 DB 正在工作并且我在测试仪工作时启动了应用程序,并且我看到它能够检查连接状态。但我想知道如果 DB 出现故障该怎么办。我的意思是应用程序试图创建一个连接池但没有成功,一段时间后它会尝试再做一次。
      • 如果你的数据库宕机了,它会重试到 acquireRetryAttempts 次,每次尝试之间会有一个 acquireRetryDelay 延迟,之后可能会导致异常。
      • 是的,这就是我所看到的。 Hibernate 尝试使用 acquireRetryDelay 延迟重新连接 acquireRetryAttempts 次,但在没有异常之后。而且我不明白如何理解hibernate是否连接到DB。
      • 实现 ConnectionTester 以进行连接验证 - mchange.com/projects/c3p0/apidocs/index.html 并在那里处理异常。否则,您必须通过 c3p0 实现并构建自己的 PooledDataSource,请参阅文档 - mchange.com/projects/c3p0/index.html
      【解决方案3】:

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

      如果连接中断,您必须建立新的。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-09-15
        • 1970-01-01
        • 2016-07-15
        • 2011-01-05
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多