如果数据库重新启动,如果发生连接泄漏,则休眠池不会刷新

时间:2018-10-04 14:06:53

标签: java postgresql hibernate c3p0

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

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

因此每个线程中都有Connection泄漏。 因此,一段时间后所有池都将不可用。从jmx(jconsole)可以看出,所有池都处于“繁忙”状态。

问题:现在,即使我重新启动postgresql,我的问题是,尽管如此,繁忙的连接显示jconsole中的休眠池为100。 c3p0 / hibernate不了解数据库已重新启动,因此应释放它。

我应该如何实现?

1 个答案:

答案 0 :(得分:1)

c3p0无法得知就DB而言,就其而言有效且已签出的Connections不再有效。签出的连接属于客户端,c3p0通常不会与它们混淆。最好的办法是修复连接泄漏,以免发生这种情况。

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