Tomcat有一个数据库连接池(DBCP),可以更快地发出请求。
在我的应用程序中,太多的连接被使用了太长时间,我怀疑是泄漏(连接没有正确关闭),我需要找出泄漏的位置。
问题:如何找出使用连接的每个线程的名称?
最好是现场JMX MBean,但也欢迎其他提示。显示每个线程的堆栈跟踪或类名也是可以接受的。
注意:我不是在寻找显示DBCP设置的MBean。我想知道每个连接的用途。
答案 0 :(得分:8)
遗憾的是,这样的豆子不存在。
您可以做的是在您的DBCP配置中启用logAbandoned
设置。有关详细信息,请查看Apache Commons-DBCP(http://commons.apache.org/dbcp/configuration.html)的文档:您可以使用Tomcat中<Resource>
元素中的所有配置选项。
logAbandoned
将告诉您哪个Connection已经检出了未及时返回的池。这可能表示连接泄漏,或只是长时间运行的查询。
更新2015-12-15
使用Tomcat的tomcat-pool
,您可以附加拦截器,例如SlowQueryReport或,以通过JMX获取通知,SlowQueryReportJmx
这些工具可能比您从Apache Commons-DBCP获得的更基本的信息做得更好。
答案 1 :(得分:8)
在克里斯托弗的回答中,我创建了一个监视借用/释放连接的工具:
https://github.com/nicolas-raoul/Commons-DBCP-monitoring
它监视Commons DBCP的使用情况,并允许用户创建这样的图表:
这使得识别哪些线程长时间保持连接非常容易。