在我们的一个遗留应用程序中有一个数据库连接泄漏,我追踪到这个小宝石。从调试,我可以看到多个线程返回相同的逻辑连接(不好!)。但我正在努力理解为什么会这样。发现并发问题
我们使用ojdbc6驱动程序,使用连接池在WebLogic数据源上进行设置。产生问题
public class MyDummyDaoUtil {
//note: this is a public field in a singleton (not a static field though...)
public Connection conn;
private MyDummyDaoUtil() {
}
public static MyDummyDaoUtil getInstance() {
if (instance == null) {
instance = new MyDummyDaoUtil();
}
return instance;
}
private DataSource getDataSource(final String dsName)
throws NamingException {
return ServiceLocator.getInstance().getDataSource(dsName);
}
public static Connection getConnection(final String source)
throws NamingException {
return MyDummyDaoUtil.getInstance().getDBConnection(source);
}
private Connection getDBConnection(final String source)
throws NamingException {
//the same logical connection is produced by the data source or something else happening?
conn = getDataSource(source).getConnection();
conn.setAutoCommit(false);
return conn;
}
}
更新修复
public class MyDummyDaoUtil {
private MyDummyDaoUtil() {
}
public static MyDummyDaoUtil getInstance() {
if (instance == null) {
instance = new MyDummyDaoUtil();
}
return instance;
}
private DataSource getDataSource(final String dsName)
throws NamingException {
return ServiceLocator.getInstance().getDataSource(dsName);
}
public static Connection getConnection(final String source)
throws NamingException {
return MyDummyDaoUtil.getInstance().getDBConnection(source);
}
private Connection getDBConnection(final String source)
throws NamingException {
Connection conn = getDataSource(source).getConnection();
conn.setAutoCommit(false);
return conn;
}
}
摘要修复
- 不正确的懒惰initializa的
代码实例的重刑
- 连接应该是方法的局部变量,而不是单例类
你说MyDummyDaoUtil是一个单身人士。如果这是在多个线程之间共享的,那么将有两个连接被请求的机会,这两个连接被请求变异引用和两次调用getDBConnection返回的相同引用(最后一个)。不能返回的连接永远不能关闭。这段代码没有结束耗尽可用连接? – Yoztastic 2014-10-08 17:57:07
@Yoztastic当他们被垃圾收集时,连接可能被他们的终结者击落,隐藏了这个问题。 – Durandal 2014-10-08 19:28:08
@Yoztastic - 是的,那是最初的症状。我们的连接已经耗尽,我们不得不打开无效超时来帮助回收这些泄露的连接,同时我们追查问题。从我所知道的情况来看,代码是从第1天开始实施的(这很吓人......)目前还不清楚这个问题没有在我们的旧系统上显示出来。我的猜测是连接被以某种方式回收,并且我们没有意识到存在这个问题。 – user1766760 2014-10-10 16:19:21