1

JDBC literatur では、次のようなスニペットによく遭遇します。

void databaseCall() {
    Connection con = null;
    Statement statement = null        
    try {      
          con = getConnection(...);    
          statement = con.createStatement(...);        
          // do some query
    } catch (SQLException e) {
         // bla bla
    } finally {
         try {con.close();} catch (Exception e1) {}
         try {statement.close();} catch (Exception e1) {}
    }
}

接続とステートメントを明示的に閉じるのがベスト プラクティスであることはわかっていますが、この場合、メソッドが終了したとき、つまりブロックが終了したときconに明らかにリソースが閉じられます。ブロック内のステートメントは本当に必要ですか? リソースを明示的に解放しなかったとしても、メソッドが終了したときに何らかの方法でリソースが閉じられるのではないでしょうか?statementtryclosefinally

4

2 に答える 2

4

いいえ、閉鎖されません。

新しい接続を作成する場合getConnection()、メソッドの最後に発生するのは、接続がガベージコレクションされる可能性があることだけです。ただし、GCはclose()メソッドを呼び出しません。そして、とにかく、あなたはできるだけ早く閉じたいです。

ほとんどの場合getConnection()、接続プールから接続を取得するだけで、非常に長い間開いたままになります。接続しないclose()と、使用可能な接続のプールに戻されず、数秒または数分後には接続を使用できなくなります。

タイトルはについて尋ねますSystem.exit()が、質問の本文はそうではありません。を呼び出すとSystem.exit()、データベースが通信が切断されたことを認識するため、接続が閉じられます。ただし、プログラムが起動してクエリを実行し、終了することは非常にまれです。ほとんどのアプリケーションは起動し、数日または数か月間実行を続けます。したがって、使用が終了したら、接続を解放する必要があります。

于 2012-08-01T11:24:40.533 に答える
-2

ekart アプリケーションに 20 の接続を持ってきたとします。つまり、接続プールには 20 の接続しかありません。サーバーにリクエストを送信すると、プールはすべてのリクエストに対して接続を提供します。接続を閉じない場合、20 番目のリクエストの後に「OutOfConnectionError」が発生します。接続がないため、このエラーを処理できず、リクエストを送信できません。接続を閉じると、新しいリクエストを送信できるのはあなただけです........

于 2015-06-18T09:48:53.077 に答える