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