首页 > 解决方案 > 在连接泄漏的情况下,如果数据库重新启动,休眠池不会刷新

问题描述

我正在使用带有 c3p0 连接池的休眠并使用 PostgreSQL 数据库并在连接池中配置了 100 max Connection

场景: 假设多个线程使用 DBSessioFactory 从休眠 c3p0 轮询中获取连接,并且每个线程都不会关闭连接。

所以每个线程都有连接泄漏。所以在一段时间内所有池都变得不可用。从 jmx(jconsole) 也可以看出,所有池都处于忙碌状态。

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

我应该如何做到这一点?

标签: javapostgresqlhibernatec3p0

解决方案


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

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


推荐阅读