MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

JDBCとMySQLの接続を閉じるべき場所は?finallyブロックを使った正しいクローズ方法

JDBCでMySQLデータベースに接続する場合、接続(Connection)は必ずfinallyブロック内で閉じるようにしましょう。finallyブロックは、tryブロック内で例外が発生したかどうかにかかわらず必ず実行されるため、リソースリークを防ぐ最も確実な方法です。

finallyブロックで接続を閉じるべき理由

tryブロックの中でclose()を呼び出すだけでは、途中で例外が発生した場合に接続が閉じられないまま残ってしまう恐れがあります。一方、finallyブロックに記述しておけば、処理が正常終了しても異常終了しても、必ず接続を閉じることができます。これにより、データベース側のコネクション枯渇やメモリリークといった問題を未然に防ぐことができます。

JDBCとMySQLで接続を閉じるJavaコード例

以下は、finallyブロック内でMySQLとの接続を閉じるJavaプログラムの例です。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class CloseConnectionDemoInFinallyBlock {
    public static void main(String[] args) {
        String JDBCURL = "jdbc:mysql://localhost:3306/web?useSSL=false";
        Connection con = null;
        try {
            con = DriverManager.getConnection(JDBCURL, "root", "123456");
            System.out.println("connection is open");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (SQLException sqlException) {
                sqlException.printStackTrace();
            }
        }
    }
}

コードのポイント

  • Connection型の変数は、tryブロックの外でnullで初期化しておくことで、finallyブロックからもアクセスできるようになります。
  • DriverManager.getConnection()メソッドでMySQLデータベースへの接続を取得します。
  • finallyブロック内でcon.close()を呼び出し、発生しうるSQLExceptionをcatchして適切に処理します。

実行結果

上記のプログラムを実行すると、コンソールには以下のように表示されます。

connection is open

このメッセージは、MySQLデータベースへの接続が正常に確立されたことを示しています。プログラムの処理が完了した後、finallyブロックによって接続が確実に閉じられます。

補足:try-with-resourcesならさらに簡潔に書ける

Java 7以降を使用している場合は、try-with-resources構文を活用することで、finallyブロックを明示的に記述しなくてもリソースを自動的にクローズできます。

String JDBCURL = "jdbc:mysql://localhost:3306/web?useSSL=false";
try (Connection con = DriverManager.getConnection(JDBCURL, "root", "123456")) {
    System.out.println("connection is open");
} catch (SQLException e) {
    e.printStackTrace();
}

この書き方はコードが簡潔になるうえ、クローズ忘れによるリソースリークも防げるため、現在のJava開発ではこちらが推奨されています。ただし、古いバージョンのJavaを扱うプロジェクトでは、本記事で紹介したfinallyブロックによるクローズが依然として有効な手法となります。

  1. MySQLのWHERE句とHAVING句の違いとは?集計関数での使い分けを実例付きで解説

    MySQLにおけるWHERE句とHAVING句の基本的な役割 MySQLでは、検索結果を絞り込むためにWHERE句という条件句を使用できます。WHERE句を使うことで、テーブルから必要なレコードだけを選択するための抽出条件(選択基準)を指定することが可能です。 一方、HAVING句は、グループ化された行や集計結果に対してフィルタ条件を指定するために使われます。 WHERE句とHAVING句の最大の違い 両者の重要な違いは次の通りです。 WHERE句:集計関数(SUM、AVG、COUNTなど)と組み合わせて使用できない HAVING句:集計関数と組み合わせて使用できる それでは、実際にサンプ

  2. MySQL JDBCドライバーの接続文字列とは?書き方と使い方を解説

    MySQL JDBCドライバーの接続文字列とはJavaからMySQLデータベースへ接続する際に必要となるのが「JDBC接続文字列」です。まず、MySQLのJDBCドライバーを読み込むためのコードは以下のようになります。Class.forName(com.mysql.jdbc.Driver);ここで指定している Driver はインターフェースであり、このクラスをロードすることでMySQL用のJDBCドライバーが利用可能になります。なお、新しいMySQL Connector/J(バージョン8.0以降)では、ドライバークラス名が com.mysql.cj.jdbc.Driver に変更されている点