找到我的java代码的哪一部分打开数据库连接但没有关闭它的最佳方法是什么? 我陷入了一个很大的批处理过程,很难调试这个问题。 我正在使用JBOSS应用服务器。
答案 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
,然后观察服务器日志。