Java 正在从JNDI获取连接>;15分钟!

Java 正在从JNDI获取连接>;15分钟!,java,tomcat,jndi,ibm-midrange,jt400,Java,Tomcat,Jndi,Ibm Midrange,Jt400,我有一个奇怪的问题,web应用程序通过JNDI连接到AS400DB2服务器,从JNDI获得连接的时间恰好持续了930-960秒!!!通常连接需要4毫秒,有时甚至需要15分钟。。。它没有关于何时/为什么发生的特殊规则。我们使用的是JTOpen jt400.jar驱动程序版本7.0 我们已将其设置为池中至少有20个空闲连接,池中最多有200个连接,并且我们通常有10个人同时处理web应用程序,因此一次使用10个以上连接的可能性很小。启用应用程序上的垃圾收集统计报告 我的猜测是JNDI查找很大,会触发

我有一个奇怪的问题,web应用程序通过JNDI连接到AS400DB2服务器,从JNDI获得连接的时间恰好持续了930-960秒!!!通常连接需要4毫秒,有时甚至需要15分钟。。。它没有关于何时/为什么发生的特殊规则。我们使用的是JTOpen jt400.jar驱动程序版本7.0


我们已将其设置为池中至少有20个空闲连接,池中最多有200个连接,并且我们通常有10个人同时处理web应用程序,因此一次使用10个以上连接的可能性很小。

启用应用程序上的垃圾收集统计报告

我的猜测是JNDI查找很大,会触发一个“停止世界”垃圾收集,在小池中执行大程序需要很长时间


第二种猜测是,您的连接没有正确地返回到连接池,因此JNDI查找需要等待连接变旧并被丢弃,然后被应用程序获得的新连接替换。

确保在不再需要连接时始终正确关闭连接。否则,您将继续分配越来越多的连接,最终DB2服务器将停止提供更多的连接。它将等待几分钟,等待现有连接超时,并为您提供该连接


要查看您有多少个连接,请获取一个优秀的数据库,它有一系列视图来监视您的数据库的状态(谁连接了,他们在做什么,哪些查询挂起死锁,等等)。是的,这需要花费金钱,但如果它能为您节省一天的时间来搜索一个bug,那么它已经是值得的了。

我建议您考虑以下几点来尝试诊断问题:

  • 首先要做的是在这漫长的查找过程中监视连接池的状态。这将允许您找出问题是否在实际检索连接时出现。无论您是否正确地关闭连接,时间安排也很重要。例如,您可以在每个用户会话中打开一个连接,直到该连接过期才关闭它
  • 检查你的DB设置,以找出它们是否与连接池的设置一致。
  • 检查您是否在数据库的某个级别上进行了锁定。这就是我以前使用过的经过优化的应用程序陷入困境的原因。问题在于记录用户访问应用程序的审核记录。当每个事务访问此记录以进行更新时,它们一直超时

  • Hm 15分钟听起来像是一个典型的超时时间,可能来自配置错误的DNS服务器。您应该尝试ping所有相关系统的主机名。

    请通读一篇关于类似主题的文章。是关于SecureRandom实现如何导致应用程序延迟20到30分钟。也许it中的一些调试方法可以帮助您解决问题。

    可能是任何中间防火墙或连接问题,例如,您是否可以尝试从同一台客户端计算机到DB的sqlplus?速度是否更快?您确定所有连接都被servlet关闭了吗。您可能正在某处打开连接,而不是关闭连接,然后等待连接超时或其他情况。第一件事是:连接是否正确关闭?是的,那是先检查的。它似乎在循环运行,因为该服务器上的另一个应用程序正在定期运行,只是想了解其他体验。您是从JNDI获取连接池还是实际连接?通常,您只需获取一次连接池,然后从中借用一个连接。请澄清:如果我调用connection.close()此连接将在此时返回到连接池,不是吗?没有任何其他解决方案返回JNDI连接,但这一个,可能有一些'惊喜'的因素,我不知道?您的数据库连接可能会过时(例如,通过防火墙关闭空闲实例)。查看数据库池组件中是否有ping功能。我认为这可能是正确的,我记得我们通过JNDI与LDAP相关的一个类似问题,池器没有正确关闭连接。我相信这是我们使用的默认连接池。我没有注意到您没有在AS/400上运行,只是连接到它。当症状发生时,使用调试器暂停JVM,并查看线程等待发生什么。