使用的 jdbc 连接似乎在泄漏,我不明白为什么
Used jdbc connections seem to be leaking and I cannot figure out why
我已经为这个问题奋斗了很长时间,但我终其一生都无法弄清楚问题出在哪里。让我为我们正在使用的堆栈做准备:
- 基于 Web Java 8 个应用程序
- GWT
- 休眠 4.3.11
- MySQL
- MongoDB
- Spring
- Tomcat 8(包括 Tomcat 连接池而不是 C3PO,例如)
- Hibernate 搜索/Lucene
- Terracotta 和 EhCache
问题是每隔几天(有时每隔一天一次,有时每 10 天一次,有所不同)在凌晨,我们的应用程序 "locks up"。澄清一下,它不会崩溃,您只是无法登录或为此做任何事情。所有后台任务 - 一切 - 都停止。如果我们在处于这种状态时尝试登录,我们可以在我们的日志文件中看到它正在将我们验证为有效用户,但从未发送任何响应,因此应用程序只是 "spins".
迄今为止,我们发现的与这些 "lock ups" 发生时间相关的唯一模式是,它发生在我们早上的计划任务或 SAP 导入 运行ning 时。尽管 运行ning 并不总是同一个过程,但有时锁定发生在我们的一个 SAP 导入期间,有时发生在内部计划任务执行期间。所有这些事情的共同点是它们 运行 在工作时间之外(凌晨 1 点到 6 点之间)并且它们是非常密集的过程。
我们正在使用 JavaMelody 进行监控,我们每次看到的是在这个凌晨 1 点到 6 点 window 的不同时间开始,使用的连接数 jdbc开始飙升(根据附图)。一旦开始,锁定发生只是时间问题,解决它的唯一方法是反弹 Tomcat 从而重新启动应用程序。
据我所知,内存、CPU 等在发生锁定时都很好,唯一看起来有问题的是使用的数量不断增加 jdbc 连接。
我已经多次检查我们的事务管理代码以确保事务被正确关闭(事务管理代码非常老式:在 try 块中显式开始和提交,在 catch 块和实体中回滚经理在 finally 块中关闭)。这一切对我来说似乎都是正确的,所以我真的非常难过。除此之外,我最近也明确配置了Hibernate连接释放模式正确after_transaction,但问题仍然存在
另一件奇怪的事情是,我们 运行 同一应用程序的多个实例用于不同的客户端,并且此问题仅在一个客户端上经常发生。尽管他们是我们的客户,但迄今为止要处理的数据最多,尽管所有客户 运行 这些计划任务,但这个大客户是唯一使用 SAP 导入的客户。这就是为什么我最初认为 SAP 导入是问题所在,但它在今天凌晨 1 点刚过就锁定了,那是导入甚至开始 运行ning 前几个小时。在这种情况下,它在执行内部计划任务期间被锁定。
有谁知道是什么导致了这种奇怪的行为?我调查了我能想到的一切,但无济于事。
如coladict所说,需要查看javamelody监控报告中的"Opened jdbc connections"页和服务器"locks up".
之前
抱歉,如果您需要在早上 2 点或 3 点执行此操作,但也许您可以 运行 晚上自动执行 wget 命令。
经过一段时间的反复试验,我和我的团队设法解决了这个问题。事实证明 JDBC 连接的激增不是锁定的原因,而是锁定的结果。 Apache Terracotta 是罪魁祸首。它似乎只是变得反应迟钝。这可能是资源分配问题,但我不这么认为,因为这种情况也发生在使用率低的服务器上,而且它们有足够多的可用资源。
幸运的是,我们实际上不再需要 Terracotta,所以我删除了它。正如我在问题中所说,我们每隔几天就会收到这些锁定 - 至少每周一次,每周一次。自从删除它以来,我们已经有 4 个月没有这样的锁定,并且还在增加。因此,如果其他人遇到同样的问题并且您正在使用 Terracotta,请尝试放弃它,事情可能会好起来,就像我的情况一样。
我已经为这个问题奋斗了很长时间,但我终其一生都无法弄清楚问题出在哪里。让我为我们正在使用的堆栈做准备:
- 基于 Web Java 8 个应用程序
- GWT
- 休眠 4.3.11
- MySQL
- MongoDB
- Spring
- Tomcat 8(包括 Tomcat 连接池而不是 C3PO,例如)
- Hibernate 搜索/Lucene
- Terracotta 和 EhCache
问题是每隔几天(有时每隔一天一次,有时每 10 天一次,有所不同)在凌晨,我们的应用程序 "locks up"。澄清一下,它不会崩溃,您只是无法登录或为此做任何事情。所有后台任务 - 一切 - 都停止。如果我们在处于这种状态时尝试登录,我们可以在我们的日志文件中看到它正在将我们验证为有效用户,但从未发送任何响应,因此应用程序只是 "spins".
迄今为止,我们发现的与这些 "lock ups" 发生时间相关的唯一模式是,它发生在我们早上的计划任务或 SAP 导入 运行ning 时。尽管 运行ning 并不总是同一个过程,但有时锁定发生在我们的一个 SAP 导入期间,有时发生在内部计划任务执行期间。所有这些事情的共同点是它们 运行 在工作时间之外(凌晨 1 点到 6 点之间)并且它们是非常密集的过程。
我们正在使用 JavaMelody 进行监控,我们每次看到的是在这个凌晨 1 点到 6 点 window 的不同时间开始,使用的连接数 jdbc开始飙升(根据附图)。一旦开始,锁定发生只是时间问题,解决它的唯一方法是反弹 Tomcat 从而重新启动应用程序。
据我所知,内存、CPU 等在发生锁定时都很好,唯一看起来有问题的是使用的数量不断增加 jdbc 连接。
我已经多次检查我们的事务管理代码以确保事务被正确关闭(事务管理代码非常老式:在 try 块中显式开始和提交,在 catch 块和实体中回滚经理在 finally 块中关闭)。这一切对我来说似乎都是正确的,所以我真的非常难过。除此之外,我最近也明确配置了Hibernate连接释放模式正确after_transaction,但问题仍然存在
另一件奇怪的事情是,我们 运行 同一应用程序的多个实例用于不同的客户端,并且此问题仅在一个客户端上经常发生。尽管他们是我们的客户,但迄今为止要处理的数据最多,尽管所有客户 运行 这些计划任务,但这个大客户是唯一使用 SAP 导入的客户。这就是为什么我最初认为 SAP 导入是问题所在,但它在今天凌晨 1 点刚过就锁定了,那是导入甚至开始 运行ning 前几个小时。在这种情况下,它在执行内部计划任务期间被锁定。
有谁知道是什么导致了这种奇怪的行为?我调查了我能想到的一切,但无济于事。
如coladict所说,需要查看javamelody监控报告中的"Opened jdbc connections"页和服务器"locks up".
之前抱歉,如果您需要在早上 2 点或 3 点执行此操作,但也许您可以 运行 晚上自动执行 wget 命令。
经过一段时间的反复试验,我和我的团队设法解决了这个问题。事实证明 JDBC 连接的激增不是锁定的原因,而是锁定的结果。 Apache Terracotta 是罪魁祸首。它似乎只是变得反应迟钝。这可能是资源分配问题,但我不这么认为,因为这种情况也发生在使用率低的服务器上,而且它们有足够多的可用资源。
幸运的是,我们实际上不再需要 Terracotta,所以我删除了它。正如我在问题中所说,我们每隔几天就会收到这些锁定 - 至少每周一次,每周一次。自从删除它以来,我们已经有 4 个月没有这样的锁定,并且还在增加。因此,如果其他人遇到同样的问题并且您正在使用 Terracotta,请尝试放弃它,事情可能会好起来,就像我的情况一样。