3

close()私は最後のブロックにを入れるという慣習に従います:

void foo() {
    Connection conn;
    try {
        conn = getConnection();
        // ..
    } final {
        try {
            conn.close()
        } catch(Exception e) {
        }
    }
}

本当にclose()接続を呼び出す必要がありますか、それともガベージコレクターが自動的に呼び出しますか?

ガベージコレクションによって生じる余分な遅延は問題ありません。接続を永久に開いたままにしたくないだけです。

4

4 に答える 4

6

接続でClose()を呼び出す必要が本当にありますか

はい。

またはガベージコレクターはそれを自動的に行いますか?

不特定。多分いくつかの実装はそれをするでしょう。あなたはそれに頼ることはできません。

GCが引き起こす余分な遅延は問題ありません。

GCはまったく起こらないかもしれません。あなたは本当に無限大で大丈夫ですか?

接続を永久に開いたままにしたくないだけです。

あなたは彼らが必要以上に一瞬開いたままになってほしくない。それらは希少な資源です。それらを無駄にしないでください。「プログラマーは、すべての接続(Connection.closeメソッドを使用)とステートメント(Statement.closeメソッドを使用)が不要になったらすぐに明示的に閉じて、DBMSリソースをできるだけ早く解放することをお勧めします。」

于 2013-02-12T23:17:59.797 に答える
2

DB接続を開いたままにしないでください。ガベージコレクションで閉じることができない場合があるため、TrywithResourcesを使用したJava7の「プロジェクトコイン」構文が役立ちます。AutoCloseableを実装するものはすべて、以下に示すように使用できます。

void foo() {
   try( Connection conn = getConnection() ) {
      // Do your Database code
   } catch(SQLException e) {
      //Handle the exception
   }
}  //conn is closed now since it implements AutoCloseable.
于 2013-02-13T04:20:01.017 に答える
1

はい、を呼び出す必要がありますclose()。このタイプのことを自動的に実行できるJDBCラッパー(Tomcat接続プールなど)がいくつかありますが、一般に、リソースが関係する場所では、自分の後で片付けることをお勧めします。

于 2013-02-12T23:13:11.337 に答える
1

一部のJDBC接続実装はclose()、ガベージコレクションされると実行されます。この例は、Postgres JDBCドライバーのfinalize()メソッドにあります(ここにコードを記述します)。ただし、これが当てはまるという保証はありません。

だが...

接続オブジェクトのガベージコレクションがいつ行われるかを知る方法はありません。ガベージコレクタには、JDBCリソースに関する知識はなく、メモリに関する知識しかありません。これは、メモリを解放する必要がある場合にのみGCが発生する可能性があることを意味します。60の接続が存在するが、まだ空きメモリがある場合、GCは実行されず、接続が不足することになります。

ある種のJDBC接続プールが発生している可能性もあります。これは、Connection取得するオブジェクトが実際の接続ではなく、プーリングロジックにラップされていることを意味します。これらの接続を行わないclose()と、プールは接続が終了したことを認識せず、他の要求に再利用できなくなり、接続プールが使い果たされます。

したがってclose()、接続を作成する場合は、常に明示的に接続してください。

于 2013-02-12T23:20:27.937 に答える