有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用的jdbc连接似乎正在泄漏,我不知道为什么

我已经为这个问题奋斗了很久,但我一辈子都搞不清楚问题出在哪里。让我为我们正在使用的堆栈设置舞台:

  • 基于Web的Java 8应用程序
  • GWT
  • 冬眠4.3.11
  • MySQL
  • MongoDB
  • 春天
  • Tomcat 8(例如,包括Tomcat连接池,而不是C3PO)
  • Hibernate搜索/Lucene
  • 兵马俑

问题是,每几天(有时是每第二天,有时是每10天一次,情况有所不同)清晨,我们的应用程序就会“锁定”。澄清一下,它不会崩溃,你只是不能登录或做任何事情。所有后台任务——所有任务——都暂停。如果我们试图在这种状态下登录,我们可以在日志文件中看到,它正在验证我们是有效用户,但从未发送响应,因此应用程序只是“旋转”

到目前为止,我们发现的唯一与这些“锁定”发生时间相关的模式是,它发生在我们早上安排的任务或SAP导入运行时。不过,运行的流程并不总是相同的,有时会在SAP导入期间发生锁定,有时会在内部计划任务执行期间发生锁定。所有这些东西的共同点是,它们在工作时间之外(凌晨1点到6点之间)运行,而且它们是相当密集的流程

我们正在使用JavaMelody进行监控,我们每次看到的是,在这个凌晨1-6点的窗口中,从不同的时间开始,使用的jdbc连接数开始激增(如附图所示)。一旦启动,锁定发生只是时间问题,解决它的唯一方法是跳出Tomcat,从而重新启动应用程序

正如我所知,当发生锁定时,内存、CPU等都很好。唯一看起来有问题的是使用的jdbc连接数量不断增加

我已经多次检查了事务管理的代码,以确保正确关闭事务(事务管理代码非常过时:在try块中显式开始并提交,在catch块中回滚,在finally块中实体管理器关闭)。对我来说这一切似乎都是正确的,所以我真的,真的很困惑。除此之外,我最近还明确地将Hibernate连接释放模式正确配置为after_transaction,但问题仍然存在

另一件奇怪的事情是,我们为不同的客户机运行同一应用程序的多个实例,而这个问题只在一个客户机上经常发生。他们是我们需要处理的数据最多的客户,尽管所有客户都运行这些预定任务,但这个大客户机是唯一一个使用SAP导入的客户机。这就是为什么我最初认为SAP导入是问题所在,但它在今天凌晨1点刚过就锁定了,而那是导入开始运行之前的几个小时。在这种情况下,它在执行内部计划任务时被锁定

有人知道是什么导致了这种奇怪的行为吗?我已经研究了我能想到的一切,但都无济于事

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    经过一段时间的反复试验,我和我的团队终于解决了这个问题。事实证明,JDBC连接中的峰值不是锁定的原因,而是锁定的结果。阿帕奇兵马俑就是罪魁祸首。它似乎只是变得毫无反应。这可能是一个资源分配问题,但我不这么认为,因为这种情况发生在使用率低的服务器上,而且它们有足够的可用资源

    幸运的是,我们实际上不再需要兵马俑,所以我把它移走了。正如我在问题中所说的,我们每几天就会收到一次这样的封锁——至少每周一次,每周一次。自从移除它以来,我们已经有4个月没有这样的封锁了,而且还在统计中。所以,如果其他人遇到同样的问题,而你正在使用陶土,试着放下它,事情可能会好起来,就像他们在我的案例中所做的那样