Java 使用过的jdbc连接似乎正在泄漏,我无法找出原因
我已经为这个问题奋斗了很多年,我一辈子都搞不清楚问题出在哪里。让我为我们正在使用的堆栈设置舞台:Java 使用过的jdbc连接似乎正在泄漏,我无法找出原因,java,hibernate,tomcat,jdbc,java-melody,Java,Hibernate,Tomcat,Jdbc,Java Melody,我已经为这个问题奋斗了很多年,我一辈子都搞不清楚问题出在哪里。让我为我们正在使用的堆栈设置舞台: 基于Web的Java8应用程序 GWT 冬眠4.3.11 MySQL 蒙哥达 弹簧 Tomcat 8(例如,包括Tomcat连接池而不是C3PO) Hibernate搜索/Lucene 兵马俑 问题是,每两天(有时是第二天,有时是每10天一次,情况有所不同)清晨,我们的应用程序就会“锁定”。澄清一下,它不会崩溃,你只是不能登录或做任何事情。所有后台任务-所有任务-暂停。如果我们尝试在处于这种状态
- 基于Web的Java8应用程序
- GWT
- 冬眠4.3.11
- MySQL
- 蒙哥达
- 弹簧
- Tomcat 8(例如,包括Tomcat连接池而不是C3PO)
- Hibernate搜索/Lucene
- 兵马俑
正如coladict所说,在服务器“锁定”之前,您需要查看javamelody监控报告中的“打开的jdbc连接”页面
很抱歉,如果您需要在凌晨2小时或3小时执行此操作,但也许您可以在夜间自动运行wget命令。经过一段时间的反复尝试,我的团队和我成功解决了此问题。结果表明,JDBC连接中的峰值不是锁定的原因,而是锁定的结果。阿帕奇兵马俑就是罪魁祸首。它似乎变得毫无反应了。这可能是一个资源分配问题,但我不这么认为,因为这种情况也发生在使用率低的服务器上,而且它们有足够的可用资源
幸运的是,我们实际上不再需要兵马俑了,所以我把它移走了。正如我在问题中所说的,我们每几天都会被关一次——至少每周一次,每周一次。自从移除它以来,我们已经有4个月没有这样的锁定了。因此,如果其他任何人遇到同样的问题,而您正在使用Terracotta,尝试放弃它,事情可能会好起来,就像他们在我的案例中所做的那样。您说交易正在关闭,但您是否正在关闭实体经理?您还需要关闭它们,以便将连接释放回池。@coladict我认为这不是真的,因为正如我所提到的,我将连接释放模式设置为after transaction,因此它应该在提交/回滚时释放它们(据我从文档中了解)。无论如何,这是一个没有实际意义的问题,因为我在问题中确实说过,我在finally块中关闭实体管理器。好的,在监控页面的“系统信息”部分有“打开的jdbc连接”链接,可以帮助您查找任何泄漏。如果有任何打开的连接,您将获得创建连接的堆栈跟踪,其峰值可能在Hibernate中的某个位置,但您只需向下移动,直到到达您的类为止。@coladict我看不到该信息的历史记录。当应用程序被锁定时,我无法访问/监控,一旦我跳转了它,“实时”数据就消失了,我只能访问图表上显示的历史数据。至少就我所知,除非你知道在我跳转app/Tomcat之后我可以获取你所指数据的方法。尝试使用jconsole或visualvm或任何其他命令工具(如jmap或jstack)获取线程转储。然后使用ThreadStackAnalyzer分析线程转储(您也可以使用文本编辑器进行分析),并查看谁持有连接。