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

Java×MySQLアプリケーションで1つのデータベース接続オブジェクトを共有する方法【シングルトンパターン】

JavaからMySQLデータベースへ接続する際、アプリケーション全体で接続オブジェクト(Connection)を1つだけにしたいケースは多くあります。接続の生成にはコストがかかるため、毎回新しい接続を作成するとパフォーマンス低下やリソースの無駄につながります。

このような場合に有効なのが、GoFデザインパターンのひとつであるシングルトンパターン(Singleton Pattern)です。この記事では、シングルトンパターンを使ってMySQLへの接続オブジェクトを1つに限定する実装方法を解説します。

シングルトンパターンとは

シングルトンパターンとは、あるクラスのインスタンスが常に1つしか存在しないことを保証し、どこからアクセスしても同じインスタンスを返す設計手法です。データベース接続のように、生成コストが高く、共有して使うべきオブジェクトに適しています。

接続を管理するクラス:ConnectDatabase.java

以下のコードは、静的なフィールドに接続オブジェクトを保持し、すでに接続が存在する場合はそれを再利用する例です。

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectDatabase {
    static Connection conn = null;

    public static Connection getConnection() {
        if (conn != null) return conn; // 既存の接続を再利用
        String database = "test";
        String username = "root";
        String password = "123456";
        return getConnection(database, username, password);
    }

    private static Connection getConnection(String databaseName, String userName, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                "jdbc:mysql://localhost/" + databaseName
                + "?user=" + userName + "&password=" + password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
}

このクラスのポイントは次のとおりです。

  • 接続オブジェクト connstatic フィールドとして保持する。
  • getConnection() を呼び出した際、connnull でなければ既存の接続をそのまま返す。
  • null の場合のみ、新しくドライバを読み込んで接続を確立する。

呼び出し側のクラス:CallConnection.java

次に、上記のメソッドを呼び出して動作を確認するクラスです。

import java.sql.Connection;

public class CallConnection {
    public static void main(String[] args) {
        Connection con = ConnectDatabase.getConnection();
        if (con != null) {
            System.out.println("Connection successful !!!");
        }
    }
}

実行結果

このプログラムを実行すると、コンソールに以下のような出力が表示されます。

Mon Feb 11 20:15:32 IST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Connection successful !!!

「Connection successful !!!」と表示されていれば、接続は正常に確立されています。

SSLに関する警告について

出力の先頭にあるWARNメッセージはエラーではなく、SSL接続に関する警告です。MySQL 5.5.45以降では、明示的に指定しない限りSSL接続がデフォルトで要求されるため表示されます。開発環境などでSSLを無効化したい場合は、JDBC URLに useSSL=false を追加します。

"jdbc:mysql://localhost/" + databaseName + "?useSSL=false&user=" + userName + "&password=" + password;

実装時の注意点

  • ドライバクラス名: com.mysql.jdbc.Driver は旧バージョン(Connector/J 5.x)用のクラス名です。Connector/J 8.x以降では com.mysql.cj.jdbc.Driver を使用してください。
  • スレッドセーフ性: マルチスレッド環境では、複数スレッドが同時に getConnection() を呼び出すと接続が重複して作成される可能性があります。必要に応じて synchronized キーワードやダブルチェックロッキングを検討しましょう。
  • 本番環境での運用: 実際の業務システムでは、シングルトンによる単一接続よりも、コネクションプール(HikariCPやApache Commons DBCPなど)を利用する方が一般的です。プールにより複数の接続を効率的に管理でき、スケーラビリティが向上します。

このように、シングルトンパターンを活用すれば、Javaアプリケーション全体でMySQLへの接続オブジェクトを1つにまとめられます。小規模なツールや学習用途にはシンプルで有効なアプローチなので、ぜひ試してみてください。

  1. Wink HubのZ-Wave接続トラブルを解決する4つの対処法

    Z-Waveは主にホームオートメーション向けに設計された無線通信プロトコルで、低消費電力の電波によるメッシュネットワークを利用して機器同士が通信します。Wink HubはWink Labs Inc.が開発したスマートホームハブで、異なるプロトコルや技術を採用したスマートホーム製品を一つにまとめ、Winkアプリから一元管理できるようにする製品です。Bluetooth Low Energy(LE)、Wi-Fi、Z-Wave、Kidde、Lutron Clear Connect、ZigBeeといった、多くのスマートホーム製品に採用されている主要プロトコルに対応しています。Wink Hubは通常非常に

  2. Windows 10の自動再生(AutoPlay)機能とは?アクセス方法と設定変更の手順を徹底解説

    Windowsオペレーティングシステムに古くから搭載されている機能のひとつが「自動再生(AutoPlay)」です。この機能はWindows 98やWindows XPの時代から存在し、Vista、Windows 7を経て、Windows 8、Windows 8.1、そして現在のWindows 10まで受け継がれてきました。 しかし、USBメモリや外付けハードディスクなどのリムーバブルストレージから感染するウイルスからPCを守れる、この重要な機能に注目しているユーザーはごく一部です。 実は、自動再生機能のオン/オフを切り替えるだけで、外部ストレージ経由で急速に広がりファイルを破壊するウイルスや