[解決済み] Javaでデータベース接続を閉じる
質問
少し混乱しています。私は以下から読んでいました 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
クラスがあり、それがまさにそれを行っているので、自分で書く必要はありません。
関連
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
jd-gui Java Exceptionが発生しました。
-
Spring Boot による HTTPS アクセスの設定
-
Dateが型に解決できない問題を解決する
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み】JDBC結果セットとステートメントは、その後接続を閉じますが、別々に閉じなければなりませんか?