3

我们有一个企业 Java 项目,该项目大量使用 Oracle DB,支持数百个并发用户,并且在过去 10 年中已被数十名开发人员所接触。每隔一段时间,开发人员就会忘记关闭 Connection、PreparedStatement 或 ResultSet 对象,并且随着用户全天使用系统,打开的连接会累加起来,直到 Oracle 抛出“Max Open Cursors”错误。我们已将数据库中的最大打开游标值增加到我们觉得合适的值。

是否有软件或技术可以扫描数千行 Java 代码并找到这些 DB 对象处于打开状态的所有位置?我们希望运行一次以查找所有当前位置,然后定期查找任何新位置。提前致谢。

4

4 回答 4

3

您可以尝试在您的源代码上运行FindBugs,它应该会拾取任何未关闭的连接。它在这里找到了一个错误列表:

http://findbugs.sourceforge.net/bugDescriptions.html

寻找以 ODR 开头的那些。

于 2012-11-20T14:13:17.897 回答
1

这取决于您是否使用任何 ConnectionPooling 机制。如果是这样,那么连接池将检查所有打开的连接。如果您已经实现了自己的池,那么您需要重新访问代码以合并此检查。

于 2012-11-20T14:14:21.347 回答
0

FindBugs有几个“错误模式”:

http://findbugs.sourceforge.net/bugDescriptions.html#ODR_OPEN_DATABASE_RESOURCE http://findbugs.sourceforge.net/bugDescriptions.html#ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH

于 2012-11-20T14:15:55.447 回答
0

Findbugs一直擅长检测未正确关闭的连接,以及许多其他问题。

我们将它用作 maven 插件,在“站点”目标期间调用。结合持续集成工具(如 Jenkins),可以自动检测此类潜在问题。

于 2012-11-20T14:17:57.627 回答