Java 如何监控我的连接到哪里?

Java 如何监控我的连接到哪里?,java,tomcat,jdbc,connection-pooling,Java,Tomcat,Jdbc,Connection Pooling,我运行一些tomcat应用程序,使用jndi连接池。 在一段时间内,连接池停止以提供连接和应用程序挂起。 似乎是因为某些代码接收到连接而不将其返回到池中。 我如何监控-它使用哪种代码? 更常见的是,我想看看现在所有的连接都在做什么 我不能更改申请。但是我可以调整Tomcat,也许可以添加一些拦截器。我从不使用连接池API本身,我总是将其包装在助手中 这样,我可以在助手中执行此操作: private Exception created = (0 == 1) ? new Exception() :

我运行一些tomcat应用程序,使用jndi连接池。 在一段时间内,连接池停止以提供连接和应用程序挂起。 似乎是因为某些代码接收到连接而不将其返回到池中。 我如何监控-它使用哪种代码? 更常见的是,我想看看现在所有的连接都在做什么


我不能更改申请。但是我可以调整Tomcat,也许可以添加一些拦截器。

我从不使用连接池API本身,我总是将其包装在助手中

这样,我可以在助手中执行此操作:

private Exception created = (0 == 1) ? new Exception() : null;

当我遇到像您这样的问题时,我只需更改一个字符(
0
->
1
)就可以在我的调试器中对创建此实例的人进行堆栈跟踪。

大多数连接池实现可以配置为检测未返回到池的连接。例如,对于Tomcat的JDBC连接池,“放弃的连接”(租约到期的连接)有各种配置选项。如果您在网页上搜索“已放弃”,您将找到以下选项:

  • 移除
  • 移除BandonedTimeout
  • 被遗弃的日志
  • 怀疑超时

正如网页上提到的,这些设置会增加一些开销,但至少你的应用程序不会挂起。在测试应用程序时,将
removeAbandonedTimeout
设置为一个较低的值,将
maxActive
设置为一个较低的值,以便您可以尽早捕获未返回的连接。

我倾向于巧妙地应用Eclipse的代码搜索功能,找出获取连接的所有代码片段,然后我调查了每一个。通常问题在于错误处理不好,比如在finally子句中没有关闭连接。这不合适,代码库非常强大,使用了很多方面和框架。假设简单的代码搜索没有帮助。是的,大型代码库需要大量的工作。这只是事实。大多数连接池实现都可以为您监控这一点。如果可以更新池的配置,则可以设置记录“放弃的连接”或“过期的租约”的参数。例如,对于Tomcat的JDBC连接池,请在第页上搜索“已放弃”。谢谢,@vanOekel,这就是我搜索的内容!!!如果您添加单独的答案-我将其标记为“编写解决方案”。不理解您的解决方案。正如我所写的,我无法编辑代码库。即使可以,这又有什么帮助呢?“更改一个字符”是什么意思?Java不会跟踪谁为您创建了一个对象。如果需要,可以尝试或更改代码库。上面的代码位于连接包装器类中。我将
0==1
更改为
1==1
,然后再次编译并部署。更改之后,我的连接包装中有一个堆栈跟踪,它告诉我是谁创建了该实例。好的,当从头开始创建新应用程序时,您建议某种设计模式如何在新应用程序中实现它。这显然不是我的情况。顺便说一句,假设这不是一个非常聪明的模式,因为我们每次都要重建应用程序。正确的解决方案应该可以在不重建的情况下工作。您可以将
(0==1)
替换为
Boolean.getBoolean()
,并使用系统属性打开和关闭此选项。