接続の回復性 により、JDBC ドライバーは中断されたアイドル状態の接続を透過的に復元し、障害が発生した場合は最初の接続を再試行できます。 この記事では、この動作を制御する 2 つの接続文字列プロパティ (connectRetryCount と connectRetryInterval) と、ドライバーがアイドル接続の切断を検出するために使用するキープアライブ設定について説明します。 接続の回復性は、Microsoft JDBC Driver 10.2.0 for SQL Server 以降で使用できます。 切断されたアイドル状態の接続を再接続するには、SQL Server 2014 以降、またはAzure SQL Databaseが必要です。
Tip
接続回復機能では、再試行するのは 初期接続 のみであり、切断されたアイドル接続を自動的に復元します。 失敗したステートメント (デッドロックの対象となる 1205 やロック タイムアウト 1222 など) を自動的に再試行したり、カスタム エラー番号 (40197 や 40613 などの一時的なエラー Azure SQL) で接続再試行リストを拡張したりするには、構成可能な再試行ロジックを使用します。 CRL はルール ベースであり、エラーとバックオフを選択します。この記事の機能と共に機能します。
JDBC ドライバーの再試行方法
JDBC ドライバーには、3 つの独立した再試行メカニズムが用意されています。 これらは一緒に動作するため、すべての機能を一度に使用できます。
| メカニズム | それが何をするか | 詳細については、こちらをご覧ください |
|---|---|---|
| アイドル状態の接続の回復性 | 中断されたアイドル状態の接続 (たとえば、サーバーまたはロード バランサーによって閉じられたプールされた接続) を透過的に復元します。 | アイドル状態の接続切断を検出する(この記事) |
| 初期接続の再試行 | 一時的なエラーの組み込みリストに対して、固定スケジュールで失敗した初期接続を再試行します。 | 初期接続を再試行する (この記事) |
| 構成可能な再試行ロジック (CRL) | 失敗したステートメントとカスタム エラー番号に対するルールベースの再試行。 Microsoft JDBC Driver 12.10 で導入されました。 | 構成可能な再試行ロジック |
初期接続を再試行する
JDBC ドライバーには、最初の接続を再試行する前にドライバーが待機する頻度と時間を制御する 2 つの接続プロパティが含まれています。 これらのプロパティを接続文字列に追加するか、データ ソース プロパティを使用して設定します。
| キーワード | 値 | 既定 | 説明 |
|---|---|---|---|
connectRetryCount |
0 から 255 までの整数 | 1 | 中止するまでに、接続の確立または再確立を試みる最大回数。 既定では、ドライバーは 1 回の再試行を行います。
0値を指定すると、再試行が無効になります。 |
connectRetryInterval |
1 から 60 までの整数 | 10 | 接続再試行の間の時間 (秒単位)。 ドライバーは、アイドル状態の接続の切断を検出するとすぐに再接続を試み、 connectRetryInterval 秒待ってから再試行します。
connectRetryCountが0されている場合、このプロパティは無視されます。 |
connectRetryCount * connectRetryIntervalがloginTimeoutより大きい場合、ドライバーはloginTimeoutに達すると接続の試行を停止します。 それ以外の場合は、 connectRetryCount が使い果たされるまで続行されます。
これらのプロパティは、 一時的な接続エラーの組み込みリストのみを再試行します。 対象となるエラーの完全な一覧 (4060、40197、40501、40613、49918-49920 など) については、 組み込みの一時的な接続エラーの一覧を参照してください。 このセットにカスタム エラー番号を追加するか、完全に置き換えるには、retryConnのを使用します。 失敗したステートメントを再試行するには、同じ記事の retryExec を使用します。
プロパティを設定する
JDBC URL、Properties オブジェクト、または SQLServerDataSource に connectRetryCount と connectRetryInterval を設定します。
JDBC URL で:
jdbc:sqlserver://server;databaseName=db;connectRetryCount=3;connectRetryInterval=10
Properties オブジェクトを使用します。 この記事のJava スニペットでは、簡潔にするためにインポートとクラス ラッパーを省略しています。
Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("connectRetryCount", "3");
props.setProperty("connectRetryInterval", "10");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);
SQLServerDataSource を使用する場合:
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setUser("...");
ds.setPassword("...");
ds.setConnectRetryCount(3);
ds.setConnectRetryInterval(10);
切断されたアイドル接続を検出する
典型的なアイドル状態接続とは、接続プール内にある接続のことです。 ドライバーは、アクティビティなしで約 30 秒後に接続がアイドル状態であると見なします。 クライアントとサーバーの間のサーバーまたはネットワーク デバイスはアイドル状態の接続を閉じる可能性があるため、ドライバーは、次のクエリを実行する前にソケットが停止していることを確認する方法が必要です。
切断されたアイドル状態を検出するために、ドライバーはソケット レベルで TCP キープアライブ パケットに依存しています。 Linux および Java 11 以降では、ドライバーは自動的に 30 秒間隔 (KeepAliveTime) でキープアライブ パケットを有効にし、障害が発生したときの再試行の間に 1 秒の遅延 (KeepAliveInterval)。
重要
Windows、Java 11 以前では、オペレーティング システムで手動でキープアライブを構成して、切断されたアイドル接続の回復を利用する必要があります。 キープアライブの構成方法については、Azure SQL データベースへの接続に関するページを参照してください。
制限事項
次のいずれかの条件に該当する場合、ドライバーは、破損したアイドル接続を復元できません。
- 完全に解析またはバッファー処理されていないオープンな結果セットがあります。
- 接続がAzure SQLに対してデータベースを切り替えました。
- 開いているトランザクションがあります。