2

Webアプリケーションに2つのデータソースがあります。として接続を取得していdataSource1.getConnection();ます。

私の質問は以下のコードを検討してください:

Connection connection = null;
connection = dataSource1.getConnection();
connection = dataSource2.getConnection();
connection.close();

接続を取得dataSource1し、すぐdataSource2に接続変数に接続を割り当てています。

接続を閉じているdataSource2間、dataSource1接続は開いたままですか?または、以下のようにする必要がありますか?

Connection connection = null;
connection = dataSource1.getConnection();
connection.close();
connection = dataSource2.getConnection();
connection.close();
4

3 に答える 3

2

2番目の例は正しいです、最初の例は開いた接続を残します。finallyまた、ブロック内のリソース(この場合は接続)を常に閉じる必要があります。次に例を示します。

Connection connection = null;

try {
    connection = dataSource1.getConnection();
} catch (SQLException e) {
    // handle exception
} finally {
    try {
        connection.close();
    } catch (SQLException e) {
        // handle exception
    }   
}

try {
    connection = dataSource2.getConnection();
    connection.close();
} catch (SQLException e) {
    // handle exception
} finally {
    try {
        connection.close();
    } catch (SQLException e) {
        // handle exception
    }
}
于 2012-05-08T15:32:46.230 に答える
1

2番目のコード例に示すように行う必要があります。

最初のケースでは、ガベージコレクター(未定義の時間が経過した後)混乱をクリーンアップし、参照を失った接続を閉じる場合があります(JDBCドライバーベンダーが実装finalize方法に適切なロジックをConnection実装している場合) )ただし、これを信頼して実行することは非常に悪い習慣と見なされます。

于 2012-05-08T15:26:59.743 に答える
0

このConnectionクラスは、AutoClosable「不要になったときに閉じなければならないリソース」を定義するインターフェースを実装します。close()したがって、接続オブジェクトは、適切に管理するためにメソッドの呼び出しが必要であると定義されています。

一方、このConnection.close()メソッドは、「ConnectionオブジェクトのデータベースとJDBCリソースが自動的に解放されるのを待つのではなく、すぐに解放する」と文書化されています。これは、どこかで接続リソースが最終的に自動的に解放されることを意味します。

ただし、結局のところ、不要になった接続は明示的に閉じる方がよいと思います。

于 2012-05-08T17:03:32.170 に答える