java – 如何跟踪未关闭的孤立JDBC连接?

前端之家收集整理的这篇文章主要介绍了java – 如何跟踪未关闭的孤立JDBC连接?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们在旧代码中发现了一个错误,其中没有关闭连接.这是一个简单的解决方案,但我想知道我们如何证明它是固定的.可以选择是否使用连接池.对于池化使用,可以很容易地为池添加监视,但是当不使用连接池时,我们如何跟踪那些未闭合的孤立连接?它就像任何其他内存泄漏?

错误看起来基本上是剪切和粘贴错误.我们有一些管理数据库连接的类,所以看起来大致如下:

OurDBConn conn1 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1);
}

/// and then later in the same method
OurDBConn conn2 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1); // NOTE Error: conn1 should be conn2
}

我不知道为什么早期的编码器不只是重用原始连接,但这就是它的本质

(开始编辑/追加)

是的,连接代码也是我们的,所以我可以使用给出的答案.

但是,我不认为我问了正确的问题,尽管下面的答案回答了我提出的问题.我不确定正确的stackoverflow要做的是什么;问另一个问题,还是编辑一个?

我应该问的一个问题是:这些孤立的,未封闭的连接如何在系统性能中表现出来?此外,由于这些连接对象仅存在于某种方法的范围内,因此连接是否有资格进行垃圾回收?然后,如果他们是gc’ed,开放连接是gc’ed的影响是什么?

(结束编辑)

解决方法

假设连接管理器也是您自己的代码,您可以将初始化的连接(以及堆栈跟踪)存储在连接管理器中的映射中,然后在返回它们时将其删除.因此,在任何时候,映射的键集都是未返回的连接集,您可以在映射中查找该值,以便找到创建它们并且从未释放它们的有罪代码. (如果连接不是合适的地图密钥,您可以使用某种唯一的ID或连接号或其他 – 实际值与其存在无关紧要).

然后只需添加一些适当的方式来按需访问这个地图,你就会很好.根据您的环境,添加将地图内容转储到文件关闭挂钩,和/或添加JConsole接口以查找正在运行的代码中的未关闭连接集,这两者都是不错的选择.

如果连接管理器不是您的代码,您仍然可以使用方面实现相同的功能.

猜你在找的Java相关文章