Hibernate在数据库强制重启后无法重新连接。

7
我发现在我们反弹(停止并重新启动)数据库(postgresql 8.3)后,使用hibernate(3.2.6)的应用程序无法重新获取连接,而是出现SocketException错误,错误信息为“broken pipe”。
我相信我们已经配置使用内置连接池。
如何使hibernate在不重启应用程序的情况下重新获取连接?
谢谢!
2个回答

7
你需要的是连接池提供的名为“连接测试”的功能——连接池应该运行一个快速查询以验证即将分配的连接不是陈旧的。不幸的是,Hibernate的默认连接池类DriverManagerConnectionProvider不支持此功能。Hibernate团队强烈反对在生产代码中使用此连接池。
然而,Hibernate自己的连接池算法相当基础。它旨在帮助您入门,并不适用于生产系统甚至性能测试。为了获得最佳性能和稳定性,您应该使用第三方池。

我的建议是您切换到其他连接池实现。如果您切换到C3P0(它与Hibernate一起提供),连接测试可以按照此处解释的说明进行配置。如果您使用Apache DBCP,则可以设置validationQuery,如此处解释所述。


2

如果您在jboss中使用hibernate,可以在deploy目录下的* -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中有相应的机制,但我不太清楚。 编辑:好吧,在阅读您的问题时,我错过了您使用Hibernate连接池的信息。请忽略我的答案,看看这里:Recover Hibernate connection

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