2012-05-08 10 views
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(); 
+1

はい、開いたままです –

答えて

2

第2の例は正しいです、最初の例は開いた接続を残します。

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 
    } 
} 
1

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

最初のケースでは、ガベージコレクタになることがあります(定義されていない時間が経過した後)、あなたが参照していない接続を閉じます(JDBCドライバベンダが適切なロジックそのConnection実装のfinalizeメソッド)では、これは非常に悪い練習と考えられます。

+1

ガベージコレクション中にGCが接続を「閉じる」のはなぜですか? – Cratylus

+0

〜user384706 JDBCドライバの実装者がfinalizeメソッドでcloseを呼び出した場合、GCは接続を終了します。 –

+0

@ user384706 MarlinPierceが指摘したように、これについてより明確な答えが更新されました。 – Romain

0

Connectionクラスは、「それはノーであるとき閉じなければならないリソースを定義AutoClosableインタフェースを実装:また、あなたは、例えば、常に密接なリソースfinallyブロック内(この場合は接続、)、するべきより長く必要とされる。したがって、接続オブジェクトは、適切に管理されるために、close()メソッドへの呼び出しを必要とするものとして定義されます。

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

しかし、残念ながら、不要になった接続を明示的に閉じる方が良いと言いたいと思います。

+1

一般的にJDBC接続はガベージコレクション**を除いて自動的に閉じられません** **ドライバの実装者が自分の仕事をした場合。 –

+0

右の音。 –

関連する問題