4

Tomcat 有一个数据库连接池 (DBCP) 可以使请求更快。

在我的应用程序中,太多的连接被使用太久,我怀疑有泄漏(连接没有正确关闭),我需要找出泄漏的位置。

问题:如何找出正在使用连接的每个线程的名称?

最好是实时 JMX MBean,但也欢迎其他提示。显示每个线程的堆栈跟踪或类名也是可以接受的。

注意:我不是在寻找显示 DBCP 设置的 MBean。我想看看每个连接的用途。

4

2 回答 2

8

不幸的是,这样的豆子并不存在。

可以做的是启用logAbandonedDBCP 配置中的设置。有关详细信息,请查看 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 获得的更多基本信息做得更好。

于 2012-07-09T14:06:08.833 回答
8

根据克里斯托弗的回答,我创建了一个工具来监控借用/释放的连接:

https://github.com/nicolas-raoul/Commons-DBCP-monitoring

它监控 Commons DBCP 的使用并允许创建这样的图表:

在此处输入图像描述

在此处输入图像描述

它使识别哪些线程长时间保持连接变得非常容易。

于 2012-08-06T05:58:08.107 回答