接続の回復性 により、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されている場合、このプロパティは無視されます。 |
ドライバーは最初のリトライを即座に実行し、その後のリトライの connectRetryInterval 秒を待つため、 connectRetryCount リトライは約 (connectRetryCount - 1) * connectRetryInterval 秒間かかります。
loginTimeout はシーケンス全体の上限を定めます。ドライバーは、経過時間に connectRetryInterval を足した値が loginTimeout に達すると再試行を停止します。これは loginTimeout 自体の1間隔前に発生します。
これらのプロパティは、 一時的な接続エラーの組み込みリストのみを再試行します。 対象となるエラーの完全な一覧 (4060、40197、40501、40613、49918-49920 など) については、 組み込みの一時的な接続エラーの一覧を参照してください。 このセットにカスタム エラー番号を追加するか、完全に置き換えるには、retryConnのを使用します。 失敗したステートメントを再試行するには、同じ記事の retryExec を使用します。
注意事項
リード+なしでretryConnを設定すると、拡張するのではなく、組み込みのリストを置き換えてしまいます。 自分でリストしていない組み込みエラー、例えば40613は再試行されません。
プロパティを設定する
JDBC URL、connectRetryCount オブジェクト、または connectRetryInterval に Properties と SQLServerDataSource を設定します。
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);
自動一時停止のサーバーレスデータベースに接続
Azure SQL Databaseのサーバーレスで自動一時停止を有効にすると、最初の接続試行でデータベースが再開されます。 その試みはエラー40613で失敗し、再開が実行されます。 データベースは通常1分以内に再開されます。 詳細は「 自動一時停止」と「自動再開」をご覧ください。
エラー40613は内蔵の過渡接続エラーリストに含まれているため、ドライバーは接続を再試行します。 この場合、あなたのアプリケーションは独自のリトライループを必要としません。 デフォルト設定では再開は含まれていません。 connectRetryCount は 1で、ドライバーはその1回の再試行を即座に実行します。 どちらの試みもデータベースが再開中の間に起こるため、アプリケーションはエラーを認識します。
履歴書を処理するには、3つのプロパティをすべてまとめて設定します:
| Property | 共同作業の重要性 |
|---|---|
connectRetryCount |
リトライ回数を決めます。 デフォルトの 1より高く設定してください。 |
connectRetryInterval |
再挑戦の間隔を空けます。最初の再挑戦は即座に行われます。運転手は次の再挑戦までこれだけの時間待ちます。 |
loginTimeout |
シーケンス全体を境界します。 ドライバーは、経過時間にloginTimeoutを加えた値がconnectRetryIntervalに達すると、再試行を停止します。 |
以下の値は約1分間繰り返し試行されます。これは典型的な履歴書をカバーしています:
jdbc:sqlserver://<server>.database.windows.net;databaseName=<database>;encrypt=true;loginTimeout=120;connectRetryCount=5;connectRetryInterval=15
loginTimeout をそれ単独で引き上げても効果はありません。接続試行はハングするのではなく、40613 で即座に失敗するためです。
connectRetryCount を単独で引き上げても役に立ちません。loginTimeout がシーケンスを途中で打ち切ってしまうからです。
切断されたアイドル接続を検出する
典型的なアイドル状態接続とは、接続プール内にある接続のことです。 ドライバーは、アクティビティなしで約 30 秒後に接続がアイドル状態であると見なします。 クライアントとサーバーの間のサーバーまたはネットワーク デバイスはアイドル状態の接続を閉じる可能性があるため、ドライバーは、次のクエリを実行する前にソケットが停止していることを確認する方法が必要です。
切断されたアイドル状態を検出するために、ドライバーはソケット レベルで TCP キープアライブ パケットに依存しています。 Linux Java 11以降のバージョンでは、ドライバーは30秒間隔(KeepAliveTime)でキープアライブパケットを自動的に有効化し、失敗時には再試行間隔1秒(KeepAliveInterval)があります。
重要
Windows、Java 11 以前では、オペレーティング システムで手動でキープアライブを構成して、切断されたアイドル接続の回復を利用する必要があります。 キープアライブの構成方法については、Azure SQL データベースへの接続に関するページを参照してください。
制限事項
次のいずれかの条件に該当する場合、ドライバーは、破損したアイドル接続を復元できません。
- 完全に解析またはバッファー処理されていないオープンな結果セットがあります。
- 接続がAzure SQLに対してデータベースを切り替えました。
- 開いているトランザクションがあります。