【问题标题】:Tomcat: see what threads are using the database connection poolTomcat:查看哪些线程正在使用数据库连接池
【发布时间】:2012-07-09 08:27:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: tomcat monitoring apache-commons-dbcp


    【解决方案1】:

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

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

    它监控 Commons DBCP 的使用情况并允许创建此类图表:

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

    【讨论】:

    • 您是否考虑重构您的解决方案,以便池本身是可查询的,而不是写信给stdout?如果你这样做,你可以将它捐赠回 Tomcat 项目,并在更新日志中获得你的名字。
    【解决方案2】:

    不幸的是,这样的 bean 不存在。

    可以做的是在您的 DBCP 配置中启用logAbandoned 设置。查看 Apache Commons-DBCP (http://commons.apache.org/dbcp/configuration.html) 的文档了解详细信息:您可以在 Tomcat 的 <Resource> 元素中使用所有配置选项。

    logAbandoned 将告诉您连接未及时返回的池中的哪个位置。这可能表示连接泄漏,或者只是长时间运行的查询。

    2015 年 12 月 15 日更新

    使用 Tomcat 的 tomcat-pool,您可以附加拦截器,例如 SlowQueryReport,或者通过 JMX 获取通知,SlowQueryReportJmx

    这些工具可能比您从 Apache Commons-DBCP 获得的更多基本信息做得更好。

    【讨论】:

    • +1 感谢您的提示!我基于这个想法创建了一个工具,请看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2012-11-27
    • 2014-12-20
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多