接続プールを使用し、その接続を使用するクラスが多数ある大きなアプリケーションを開発しています。最近、一部のクラスが connection.close() メソッドを呼び出す前にステートメントを閉じておらず、接続が閉じられると関連するステートメントも閉じられると誤って信じてしまうため、いくつかの問題が発生しました。
現時点では、いくつかのコードをリファクタリングし、接続を管理し (接続を取得してデータソースに戻す)、ステートメントの詳細をサブクラスに実装する抽象クラスを開発しています。
閉じられていないステートメントに関連する将来のエラーを回避するために、接続をプールに戻す前にいくつかのチェックを実装することを考えました。開いているステートメントが見つかった場合は、それらを閉じるか、警告をログに記録します。
結果のクラスは次のようになります。
public abstract class AbstractDatabaseLoader {
private DataSource dataSource;
public final DatabaseValues load(DatabaseParams params) {
DatabaseValues result = null;
Connection connection = null;
try {
connection = dataSource.getConnection();
result = load(connection, params);
} catch (Exception ex) {
// some logging;
} finally {
if (connection != null) {
try {
if (validateStatements(connection)){
logger.warn("The Connection is being returned into the POOL with opened Statments!");
}
connection.close();
} catch (SQLException e) {
// some logging.
}
}
}
return result;
}
protected abstract DatabaseValues load(Connection connection, DatabaseParams params);
private boolean validateStatements(Connection connection){
// Do Something here to validate if statements were properly closed.
}
}
ただし、接続インターフェイスからステートメントを復元する方法が見つかりませんでした。
そう:
- これは、特定の実装に依存しなくても可能ですか?
- このアプローチをお勧めしますか?
どうもありがとう、
カルレス