【发布时间】:2026-01-30 04:05:02
【问题描述】:
我发现在我们反弹(停止并启动)我们的数据库(postgresql 8.3)后,我们使用休眠(3.2.6)的应用程序无法重新获取连接,而是收到带有消息“的 SocketException”破管子”。
我相信我们已配置为使用内置连接池。
如何在数据库重新启动后不重新启动应用程序使休眠重新获取连接?
p.
【问题讨论】:
标签: hibernate
我发现在我们反弹(停止并启动)我们的数据库(postgresql 8.3)后,我们使用休眠(3.2.6)的应用程序无法重新获取连接,而是收到带有消息“的 SocketException”破管子”。
我相信我们已配置为使用内置连接池。
如何在数据库重新启动后不重新启动应用程序使休眠重新获取连接?
p.
【问题讨论】:
标签: hibernate
您想要的是连接池提供的称为连接测试的功能 - 连接池应该运行一个快速查询来验证它即将分发的连接是否过时。不幸的是,Hibernate 的默认连接池类 DriverManagerConnectionProvider 不支持此功能。 Hibernate 团队strongly discourages 在生产代码中使用这个连接池。
Hibernate 自己的连接池 然而,算法相当 初级的。它旨在帮助 你开始了,不是故意的 用于生产系统,或 即使是性能测试。你 最好使用第三方池 性能和稳定性。
我的建议是您切换到其他一些连接池实现。如果您切换到 C3P0(Hibernate 附带),则可以按照 here 的说明配置连接测试。如果您使用 Apache DBCP,它可以让您按照 here 的说明设置验证查询。
【讨论】:
如果你在 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
【讨论】: