泄漏数据库连接

时间:2012-02-29 15:58:12

标签: java database jdbc jboss database-connection

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

3 个答案:

答案 0 :(得分:3)

Findbugs有两个规则,可能有所帮助。我总是找到那些有用的东西:

  

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

     

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

     

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

     

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

参考:

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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,然后观察服务器日志。