我已经为此做了很多小时,但没有成功。我在多线程应用程序中实例化一个 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 应用程序中运行。我一直在想这可能是一个类加载器问题。