一旦数据库被退回,hibernate就不会重新连接

时间:2011-03-09 06:46:51

标签: hibernate

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

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

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

2 个答案:

答案 0 :(得分:7)

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

  

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

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

答案 1 :(得分: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连接池。所以忽略我的答案,看看这里:Recover Hibernate connection