我发现在我们反弹(停止并启动)我们的数据库(postgresql 8.3)之后,我们使用hibernate(3.2.6)的应用程序无法重新获取连接,而是获得带有消息的SocketException“破管“。
我相信我们已配置为使用内置连接池。
如何在数据库重启后重新获取连接而不重新启动应用程序?
第
答案 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