【问题标题】:Jdbc DataSource multi threading not realeasing connectionsJdbc DataSource多线程不释放连接
【发布时间】:2012-06-13 10:58:22
【问题描述】:

我已经为此做了很多小时,但没有成功。我在多线程应用程序中实例化一个 DataSource。所有线程都从 DataSource 获取连接并在 finally 块中关闭它们(我逐行检查以确保释放连接)。我遇到的问题是,即使在每个连接上都调用了 close 方法,但它们并没有被 DataSource 释放。我知道这一点是因为我有一个不同的线程从 DBCP 数据源打印 source.getNumActive()

这是基本设置。

public class DataSourceHolder {
  private static DataSource source;
  static {
    get the data source either from jndi or created from scratch
  }
  public DataSource getDataSource() { return source; }
}

我有一个简单的 JdbcPattern(像 springs JdbcTemplate 但非常简单)来封装所有样板代码。这是这样定义的:

public class JdbcPattern {
  private DataSource source;
  public JdbcPattern(DataSource source) {
    this.source = source;
  }
  public int executeMethods(....) {
    Connection c = source.getConnection();
    try {
      .. do the statements
    } finally {
      try { c.close(); } catch (SQLException ignore) { }
    }
  }
  public List<?> queryMethods(....) {
  }
}  

最后我有四个线程在程序开始时启动。该线程会休眠一段时间,并在唤醒时使用 DataSourceHolder 提供程序 DataSource 实例化一个 JdbcPattern 并开始做一些事情。事情完成了,当连接关闭时,数据源并没有真正释放它。在 DataSource 达到最大连接数后,由于无法实例化更多连接,程序将冻结。

您将如何诊断?

编辑。这是在tomcat上运行的。所有常用方法都由 catalina common loader 加载,线程在其中一个 Web 应用程序中运行。我一直认为这可能是类加载器问题。

【问题讨论】:

  • 数据源应该有活动连接。这是一个连接池。

标签: java multithreading jdbc


【解决方案1】:

您不应忽略关闭失败。将其包装在未经检查的异常中或将其记录下来,但不要忽略。如果在尝试释放与池的连接时出现一些奇怪的错误,您不会知道。

我建议您为池数据源创建自己的包装器。您可以记录对 getConnection 的调用以及堆栈跟踪和连接的唯一标识符。当它调用 close 时,也以相同的方式在 JdbcPattern 中记录。查找未关闭的连接的标识符,注意从 getConnection 堆栈跟踪中将它们从池中取出的位置。您还可以让您的 DataSource 包装器在服务器内部进行此分析,但这需要更多代码和更多出错的机会。我会先尝试简单的日志记录。考虑将此日志记录保留在产品中,但低于正常的日志记录阈值。您将再次需要它。

【讨论】:

  • 我不会在实际代码中忽略它。我因无视异常而被咬过很多次。将开始退出进程以查看问题所在。
  • 好消息。我概述的一般模式通常是我所做的:(1)添加更多日志记录。如果很难理解数据,(2) 通过验证我的一些期望并在记录之前过滤数据来使记录器更智能。 (3) 利润?
  • 问题是我相信这件事更晦涩难懂。我已经广泛地分离了这些功能,并确保关闭所有东西......它真的必须是我错过的一些非常愚蠢的东西或者非常模糊的东西。
  • 找到了。记录是你的朋友。但一个真正的好朋友!确实是在不应该出现的部分代码中创建了一个额外的连接。
猜你喜欢
  • 2023-03-15
  • 2013-05-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多