2

接続プールを使用し、その接続を使用するクラスが多数ある大きなアプリケーションを開発しています。最近、一部のクラスが 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.
    }

}

ただし、接続インターフェイスからステートメントを復元する方法が見つかりませんでした。

そう:

  1. これは、特定の実装に依存しなくても可能ですか?
  2. このアプローチをお勧めしますか?

どうもありがとう、

カルレス

4

1 に答える 1

1

Connection.closeAPI 言う

Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released. 

接続が実際には閉じられていない接続プールであっても、この接続によって作成されたすべてのステートメントと ResultSet を閉じるのは接続プール プロバイダーの義務であり、これは優れたプロバイダーが実際に行っていることです。commons-dbcp http:/を参照してください。 /commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/DelegatingConnection.html#close()それは言うCloses the underlying connection, and close any Statements that were not explicitly closed.

于 2013-05-06T11:15:57.797 に答える