私が恐れているのは、Java での接続プーリングを理解する上で根本的な問題を抱えているのではないかということです。
IDBCDataSource を接続プールとして使用しています。アプリケーションのエントリ ポイントで、たとえば setMaxActive=50 で BasicDataSource をインスタンス化します。その DataSource のインスタンスは、いくつかのビジネス ロジックによって利用されるさまざまな DAO に渡されます。
各 DAO は getConnection() を呼び出しますが、呼び出される close() は 1 つもありません。私の推測では、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();
}
}