在连接泄漏的情况下,在数据库重新启动的情况下,Hibernate 池不会刷新

Hibernate pool does not refresh in case of database restart in case of connection leak

我正在使用带 c3p0 连接池的休眠并使用 PostgreSQL 数据库并在连接池中配置了 100 个最大连接

场景:假设多个线程使用 DBSessioFactory 从 hibernate c3p0 poll 获取连接并且每个线程都没有关闭连接。

因此每个线程中都存在连接泄漏。 所以在一段时间内所有池都变得不可用。正如从 jmx(jconsole) 中也看到的那样,所有池都处于 Busy 状态。

问题: 现在我的问题是,即使我重新启动 postgresql,事件虽然,繁忙的连接显示是 jconsole 中的休眠池是 100。 c3p0/hibernate 不明白数据库已经重新启动并且应该释放它。

我该如何实现?

c3p0 无法知道就其而言有效且已签出的连接由于数据库重置而不再有效。签出连接属于客户端,c3p0 通常不会与它们混淆。最好的办法是修复连接泄漏,这样就不会发生这种情况。

如果您无法修复泄漏(只修复泄漏!),c3p0 确实提供了一个丑陋的解决方法,它的 unreturnedConnectionTimeout 设置。您可以设置比有效客户端使用的超时更长的时间,并且 c3p0 最终会在超过此超时时清理泄漏的连接。