【问题标题】:hibernate does not reconnect once the database is bounced一旦数据库被退回,hibernate 不会重新连接
【发布时间】:2026-01-30 04:05:02
【问题描述】:

我发现在我们反弹(停止并启动)我们的数据库(postgresql 8.3)后,我们使用休眠(3.2.6)的应用程序无法重新获取连接,而是收到带有消息“的 SocketException”破管子”。

我相信我们已配置为使用内置连接池。

如何在数据库重新启动后不重新启动应用程序使休眠重新获取连接?

p.

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    您想要的是连接池提供的称为连接测试的功能 - 连接池应该运行一个快速查询来验证它即将分发的连接是否过时。不幸的是,Hibernate 的默认连接池类 DriverManagerConnectionProvider 不支持此功能。 Hibernate 团队strongly discourages 在生产代码中使用这个连接池。

    Hibernate 自己的连接池 然而,算法相当 初级的。它旨在帮助 你开始了,不是故意的 用于生产系统,或 即使是性能测试。你 最好使用第三方池 性能和稳定性。

    我的建议是您切换到其他一些连接池实现。如果您切换到 C3P0(Hibernate 附带),则可以按照 here 的说明配置连接测试。如果您使用 Apache DBCP,它可以让您按照 here 的说明设置验证查询。

    【讨论】:

      【解决方案2】:

      如果你在 jboss 中使用 hibernate,你可以在部署目录的 *-ds.xml 文件中配置它,以便在从连接池获取连接之前执行一些查询: 例如:

      <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
      

      如果你使用自己的连接池,你可以这样写:

      Connection getConnectionFromPool() {
         try {
            //get connection from pool
            //execute some simple uery that should always work
         } catch (SocketException s) {
            //close broken connection and get a new one
         }
         return connection;
      }
      

      或者也许在hibernate中有这种机制,但我不知道。

      编辑:好的,阅读您的问题,我错过了您正在使用休眠连接池。所以忽略我的回答,看这里:Recover Hibernate connection

      【讨论】: