我們發現連接未關閉的舊代碼中存在一個錯誤。這是一個簡單的解決方法,但我想知道我們如何去證明它是固定的。可以選擇是否使用連接池。對於池的使用,可以很容易地爲池添加監視,但是當沒有使用連接池時,我們如何跟蹤這些未關閉的孤立連接?它就像其他內存泄漏一樣嗎?如何跟蹤未關閉的孤立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的事情是;問另一個問題,或者編輯這個問題?
我應該問的一個問題是:這些孤立的,未關閉的連接將如何在系統性能中體現出來?另外,由於這些連接對象僅存在於特定方法的範圍內,因此連接是否有資格進行垃圾收集?然後,如果他們被打了招呼,開放連接的影響是什麼?
(編輯完)
我會密切關注這一個,我們在幾個項目中遇到了類似的問題。 – Tenner
爲了記錄,我需要有一個非常好的理由,不要將其轉移到成熟的連接池實現,例如DBCP或C3PO - 如果您有機會 - 也許您應該考慮這樣做? – teabot