我多年来一直在与这个问题作斗争,我不能为我的生活找出问题所在。让我为我们正在使用的堆栈设置阶段:
问题在于,每天早上(有时每隔一天,有时每10天一次,它会有所不同),我们的应用程序会锁定#34;为了澄清,它不会崩溃,你只是无法登录或做任何事情。所有后台任务 - 一切 - 只是暂停。如果我们在处于此状态时尝试登录,我们可以在我们的日志文件中看到它正在验证我们是否为有效用户,但是没有发送任何响应,因此应用程序只是"旋转"。
我们迄今发现的唯一模式与这些"锁定"发生在我们的早晨计划任务或SAP导入正在运行时。它并不总是与正在运行的进程相同,有时会在我们的某个SAP导入过程中发生锁定,有时在内部计划任务执行期间会发生锁定。所有这些事情的共同之处在于它们在工作时间之外(凌晨1点到早上6点之间)运行,并且它们是非常密集的过程。
我们正在使用JavaMelody进行监控,我们每次看到的是在这个1 - 6am窗口的不同时间开始,使用的jdbc连接数刚刚开始出现峰值(根据附图)。一旦启动,锁定发生只是一个时间问题,解决问题的唯一方法是跳转Tomcat,从而重新启动应用程序。
据我所知,内存,CPU等在锁定发生时都很好,看起来它唯一有问题的是使用的jdbc连接数量不断增加。
我已经多次检查了事务管理的代码以确保事务正确关闭(事务管理代码非常老式:在try块中显式开始和提交,在catch块中回滚和实体管理器关闭在一个最后的块)。这一切对我来说都是正确的所以我真的非常难过。除此之外,我最近还明确地将Hibernate连接释放模式正确配置为after_transaction,但问题仍然存在。
另一个奇怪的事情是我们为不同的客户端运行同一个应用程序的几个实例,这个问题只针对一个客户端定期发生。它们是我们的客户端,虽然目前处理的数据最多,但是所有客户端都运行这些计划任务,但这个大客户端是唯一一个使用SAP导入的客户端。这就是为什么我最初认为SAP进口是问题,但它在今天早上凌晨1点之后就已经锁定了,而且在进口甚至开始运行前几个小时。在这种情况下,它在执行内部计划任务期间被锁定。
有谁知道可能导致这种奇怪行为的原因是什么?我已经研究了我能想到的一切,但无济于事。
答案 0 :(得分:0)
经过一段时间和大量的反复试验,我和我的团队成功解决了这个问题。事实证明,JDBC连接的峰值并不是锁定的原因,而是锁定的结果。 Apache Terracotta是罪魁祸首。它似乎变得没有反应。这可能是一个资源分配问题,但我不这么认为,因为这种情况发生在使用率较低的服务器上,而且他们有足够的可用资源。
幸运的是,我们实际上不再需要兵马俑,所以我将它删除了。正如我在问题中所说的那样,我们每隔几天就会得到这些锁定 - 每周至少一次,每周一次。自从删除它以来,我们已经有4个月没有这样的锁定和计数。因此,如果其他人遇到同样的问题并且您正在使用Terracotta,请尝试删除它,事情可能会正确,就像我在案例中所做的那样。
答案 1 :(得分:-1)
正如coladict所说,你需要在javamelody监控报告中和服务器“锁定”之前查看“打开的jdbc连接”页面。
很抱歉,如果您需要在早上2小时或3小时执行此操作,但也许您可以在晚上自动运行wget命令。