java - 在连接泄漏的情况下,如果数据库重新启动,休眠池不会刷新
问题描述
我正在使用带有 c3p0 连接池的休眠并使用 PostgreSQL 数据库并在连接池中配置了 100 max Connection
场景: 假设多个线程使用 DBSessioFactory 从休眠 c3p0 轮询中获取连接,并且每个线程都不会关闭连接。
所以每个线程都有连接泄漏。所以在一段时间内所有池都变得不可用。从 jmx(jconsole) 也可以看出,所有池都处于忙碌状态。
问题: 现在我的问题是即使我重新启动 postgresql,但事件,显示的繁忙连接是 jconsole 中的休眠池为 100。c3p0/hibernate 不明白数据库已经重新启动,它应该释放它。
我应该如何做到这一点?
解决方案
c3p0 无法知道就其而言有效且已签出的连接由于数据库重置而不再有效。签出的连接属于客户端,c3p0 通常不会弄乱它们。最好的办法是修复您的连接泄漏,这样就不会发生这种情况。
如果您无法修复泄漏(只需修复泄漏!),c3p0 确实提供了一个丑陋的解决方法,它的unreturnedConnectionTimeout设置。您可以将超时设置为比有效客户端使用的时间更长,并且 c3p0 最终会在超过此超时时清除泄漏的连接。
推荐阅读
- python - 由其他数组索引numpy数组作为索引
- javascript - 不从 React 中的函数渲染 JSX
- python-3.x - 如何从 Python Matplotlib_venn 中的虚拟变量绘制维恩图?
- python - 如果没有一个if是真的,我如何打印else?
- r - 如果有代码将列表中的每个元素与列中的每个元素完全匹配
- mysql - DB超时或执行时间过长
- c# - C#中的二项式系数
- azure - 如何在程序运行时让 Microsoft Azure Speech To Text 开始转录?(统一,C#)
- python - 使用 itertools groupby 查找列表中所有偶数的组
- javascript - 检查渐变是否太轻javascript