1. 概要

この記事では、JDBC接続ステータスのいくつかの側面について説明します。 まず、接続が失われる最も一般的な理由を確認します。 次に、接続ステータスの確認方法を学習します。

また、SQLステートメントを実行する前に接続を検証する方法についても学習します。

2. JDBC接続

接続クラスは、データソースとの通信を担当します。 さまざまな理由で接続が失われる可能性があります。

  • データベースサーバーがダウンしています
  • ネットワーク接続
  • 閉じた接続の再利用

接続が失われたときにデータベース操作を実行すると、SQLExceptionが発生します。 さらに、問題の詳細について例外を検査できます。

3. 接続の確認

接続を確認する方法はいくつかあります。 これらのメソッドを見て、それぞれをいつ使用するかを決定します。

3.1. 接続状態

isClosed()メソッドを使用して接続ステータスを確認できます。 この方法では、SQL操作を許可できません。 ただし、接続が開いているかどうかを確認すると便利です。

SQLステートメントを実行する前にステータス条件を作成しましょう。

public static void runIfOpened(Connection connection) throws SQLException
{
    if (connection != null && !connection.isClosed()) {
        // run sql statements
    } else {
        // handle closed connection path
    }
}

3.2. 接続の検証

接続が開かれていても、前のセクションで説明した理由により、接続が失われる可能性があります。 したがって、SQLステートメントを実行する前に、接続を検証する必要がある場合があります。

バージョン1.6以降、 Connectionクラスは検証メソッドを提供します。 まず、検証クエリをデータベースに送信します。 次に、タイムアウトパラメータを操作のしきい値として使用します。 最後に、操作がタイムアウト内に成功した場合、接続は有効としてマークされます。

ステートメントを実行する前に接続を検証する方法を見てみましょう。

public static void runIfValid(Connection connection)
        throws SQLException
{
    if (connection.isValid(5)) {
        // run sql statements
    }
    else {
        // handle invalid connection
    }
}

この場合、timeoutは5秒です。 ゼロの値は、タイムアウトが検証に適用されないことを示します。 一方、ゼロ未満の値はSQLExceptionをスローします。

3.3. カスタム検証

カスタム検証メソッドを作成するのには十分な理由があります。 たとえば、検証メソッドなしでレガシーJDBCを使用できます。 同様に、プロジェクトでは、すべてのステートメントの前にカスタム検証クエリを実行する必要がある場合があります。

事前定義された検証クエリを実行するメソッドを作成しましょう。

public static boolean isConnectionValid(Connection connection)
{
    try {
        if (connection != null && !connection.isClosed()) {
            // Running a simple validation query
            connection.prepareStatement("SELECT 1");
            return true;
        }
    }
    catch (SQLException e) {
        // log some useful data here
    }
    return false;
}

まず、接続状態を確認します。 次に、成功するとtrueを返す検証クエリを実行しようとします。 最後に、検証クエリが実行されないか失敗した場合は、falseを返します。

これで、ステートメントを実行する前にカスタム検証を使用できます。

public static void runIfConnectionValid(Connection connection)
{
    if (isConnectionValid(connection)) {
        // run sql statements
    }
    else {
        // handle invalid connection
    }
}

確かに、データベース接続を検証するには、単純なクエリを実行することをお勧めします。 ただし、ターゲットドライバーとデータベースに応じて他の便利な方法があります

  • 自動コミット– connection.getAutocommit()および connection.setAutocommit()を使用
  • メタデータ– connection.getMetaData()を使用

4. 接続プール

データベース接続は、リソースの面で高価です。 C 接続プーリングは、これらの接続を管理および構成するための優れた戦略です。要するに、接続ライフサイクルのコストを削減できます。

すべてのJava接続プーリングフレームワークには、独自の接続検証実装があります。 さらに、それらのほとんどは、パラメーター化可能な検証クエリを使用します。

最も人気のあるフレームワークのいくつかを次に示します。

  • Apache Commons DBCP – validationQuery、validationQueryTimeout
  • Hikari CP – connectionTestQuery、validationTimeout
  • C3P0 – PreferredTestQuery

5. 結論

この記事では、JDBC接続ステータスの基本について説明しました。 接続クラスのいくつかの役立つメソッドを確認しました。 その後、SQLステートメントを実行する前に接続を検証するためのいくつかの代替案について説明しました。

いつものように、この記事に示されているすべてのコードサンプルは、GitHubから入手できます。