【问题标题】:Leaked DB Connection泄露的数据库连接
【发布时间】:2012-02-29 15:58:12
【问题描述】:

找到我的 java 代码的哪一部分正在打开数据库连接但没有关闭它的最佳方法是什么? 我被困在一个大批量的过程中,很难调试这个问题。 我正在使用 JBOSS 应用服务器。

【问题讨论】:

  • 帮助您发现不断增长的事物的分析器也会有所帮助。

标签: java database jdbc jboss database-connection


【解决方案1】:

Findbugs 有两条规则,这可能会有所帮助。我总是觉得这些很有用:

ODR:方法可能无法关闭数据库资源 (ODR_OPEN_DATABASE_RESOURCE)

该方法创建数据库资源(如数据库连接 或行集),不将其分配给任何字段,将其传递给其他 方法,或返回它,并且似乎并没有关闭所有对象 方法的路径。未能关闭所有数据库资源 方法外的路径可能会导致性能不佳,并可能导致 应用程序与数据库通信时出现问题。

ODR:方法可能无法在异常时关闭数据库资源 (ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)

该方法创建数据库资源(例如数据库连接 或行集),不将其分配给任何字段,将其传递给其他 方法,或返回它,并且似乎并没有关闭所有对象 方法外的异常路径。关闭数据库失败 方法外所有路径上的资源可能会导致性能不佳, 并可能导致应用程序在与 数据库。

参考:

【讨论】:

    【解决方案2】:

    如果您无法单步执行代码,我建议您使用老式方法,添加一堆 System.out 并将详细信息放入 out 语句中,以帮助您确定连接何时打开。您可能能够非常接近地确定代码的哪一部分正在执行此操作。至少,它可能会减少您需要关注的代码量。

    【讨论】:

      【解决方案3】:

      JBoss 数据源为此目的永远有一个标志

      (来自数据源的DTD):

      <!-- Whether to check for unclosed statements when a
           connection is returned to the pool and result sets are
           closed when a statement is closed/return to the prepared
           statement cache.
           valid values are:
           false - do not track statements and results
           true - track statements and result sets and warn when they are not closed
           nowarn - track statements but do no warn about them being unclosed (the default)
           e.g.
           <track-statements>nowarn</track-statements>
      --> 
      

      因此,在您的 *-ds.xml 文件中,您将元素设置为 true,然后查看服务器日志。

      【讨论】:

        猜你喜欢
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 2014-02-25
        • 1970-01-01
        相关资源
        最近更新 更多