2
我正在審查大量現有代碼,試圖查找會導致連接池用完或拋出其他錯誤的未關閉連接。MySQL和JDBC連接池:未關閉的語句
在一些地方我看到連接返回到池,ResultSet被關閉,但PreparedStatement沒有關閉。
在僞代碼它應該是這樣的:
Connection conn = null;
try {
conn = MyJdbcTemplateHolder.getNewConnectionFromPool();
PreparedStatement ps = conn.prepareStatement(sql, ...);
ResultSet rs = st.executeQuery();
// do stuff with results
} catch(Exception e) {
// exception
} finally {
rs.close();
MyJdbcTemplateHolder.returnConnectionToPool(conn);
//***** Here is what's missing: st.close(); *****
}
的問題是:可以公開聲明的原因的問題,因爲它沒有明確關閉?或者正在關閉ResultSet並返回足夠的連接?
很顯然,我不是在談論一個開放的聲明 - 我們有100個連接池和數十個可能出現此問題的代碼位置。
- MySQL的版本是5.1
- 我的JDBC罐子使用mysql-connector-java的5.1.11-bin.jar
+1 - 是!簡短的回答。按照您打開它的相反順序關閉所有JDBC。永遠,永遠,永遠。如果你沒有做到這一點,這需要一個根深蒂固的習慣,足以解決它。 – rfeak 2011-03-02 16:34:40
感謝kvista,我明白了,這就是我所害怕的......我認爲這個代碼會有很多工作。有沒有人知道我應該期待什麼樣的行爲,因爲未公開的陳述?或者他們在封面下發生了什麼? – Galz 2011-03-02 17:15:43
我的個人經驗是數據庫沒有連接,因爲他們沒有被清理和徘徊。池會要求新的數據庫,最終數據庫將不再提供。隨着時間的推移,數據庫最終會清理連接,但速度比他們「泄露」的速度慢。 – rfeak 2011-03-02 17:40:34