我的恐懼是,我在理解Java中的連接池時遇到了一個根本性問題。Java連接池 - 垃圾回收或調用close()?
我使用IDBCDataSource作爲連接池。 在我的應用程序的入口點,我實例化一個BasicDataSource,例如setMaxActive = 50。該數據源的實例被傳遞到某些業務邏輯所使用的各種DAO中。
每個DAO調用getConnection(),但沒有調用一個close()。我的假設是,在不使用DAO後,垃圾收集器關閉連接。
我的問題是,我不斷用完連接(即等待可用連接的代碼)。
現在讓我們說我會在每個數據庫操作結束時添加一個close()調用。拋出異常會發生什麼。我必須捕獲DAO中的每個異常,確保關閉連接,然後重新拋出發生的異常!
例 - 當前的方法:
public class MyDAO {
private Connection con;
public MyDAO (DataSource ds) {
con = ds.getConnection();
}
public MyReturnClass execSomeQuery() throws SQLException {
String sql = String.format("SELECT * FROM foo");
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
…
...
}
return result;
}
}
public class MyAppLogic() {
DataSource ds;
public MyAppLogic(DataSource ds) {
this.ds = ds;
}
public void doSomeStuff() {
MyDAO myDAO = MyDAO(ds);
myDAO.execSomeQuery();
}
}
這也意味着我需要捕捉每個異常,關閉連接,然後重新拋出異常? 這也意味着每個DAO方法都需要單獨獲取連接,而不是整個DAO類獲取一個連接。 getConnection()是否會導致開銷? –
1)是抓住每一個連接2)那麼什麼?你沒有得到任何東西你的方式。池會重用連接 – Cratylus