1. ホーム
  2. java

[解決済み] Javaでデータベース接続を閉じる

2022-07-04 19:37:47

質問

少し混乱しています。私は以下から読んでいました Java データベース接続 :

Connection conn = DriverManager.getConnection(
     "jdbc:somejdbcvendor:other data needed by some jdbc vendor",
     "myLogin",
     "myPassword" );

Statement stmt = conn.createStatement();
try {
    stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
    // It's important to close the statement when you are done with it
    stmt.close();
}

を閉じる必要はないのでしょうか? conn の接続を閉じる必要はないのでしょうか? conn.close()が発生しない場合、実際には何が起こっているのでしょうか?

私がメンテナンスしているプライベートなWebアプリケーションでは、現在どちらのフォームも閉じていないのですが、重要なのは、本当に stmt の方なのか、それとも conn のどちらか、あるいは両方ですか?

サイトが断続的にダウンし続けるのですが、サーバーはデータベース接続の問題だと言い続けています。私の疑いは、それが閉じられていないことですが、閉じられるとしたら、どちらかわかりません。

どのように解決すればよいのでしょうか。

を使い終わったら Connection を使い終わったら、明示的にそれを閉じる必要があります。 close() メソッドを呼び出すことで、接続が保持している他のデータベースリソース (カーソル、ハンドルなど) を解放する必要があります。

実は、Javaの安全なパターンは、テスト実行中に ResultSet , Statement そして Connection (の順)の中に finally ブロックの中に入れてください。このようなものです。

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    // Do stuff
    ...

} catch (SQLException ex) {
    // Exception handling stuff
    ...
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* Ignored */}
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) { /* Ignored */}
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) { /* Ignored */}
    }
}

finally ブロックは、(NULLチェックを避けるために)わずかに改良することができます。

} finally {
    try { rs.close(); } catch (Exception e) { /* Ignored */ }
    try { ps.close(); } catch (Exception e) { /* Ignored */ }
    try { conn.close(); } catch (Exception e) { /* Ignored */ }
}

しかし、それでもこれは非常に冗長なので、一般的にはヌルセーフなヘルパーメソッドでオブジェクトをクローズするヘルパークラスと finally ブロックはこのようなものになります。

} finally {
    DbUtils.closeQuietly(rs);
    DbUtils.closeQuietly(ps);
    DbUtils.closeQuietly(conn);
}

そして、実は Apache Commons DbUtils には DbUtils クラスがあり、それがまさにそれを行っているので、自分で書く必要はありません。