在我們的一個遺留應用程序中有一個數據庫連接泄漏,我追蹤到這個小寶石。從調試,我可以看到多個線程返回相同的邏輯連接(不好!)。但我正在努力理解爲什麼會這樣。發現併發問題
我們使用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