JDBC ドライバーのタイムアウト プロパティについて
JDBC ドライバーのタイムアウト設定を使用して、アプリケーションの応答性に優先順位を設定できます。 ドライバーのタイムアウトの多くは、データの整合性を確保するために、既定で結果の待機を優先します。 必ず、アプリケーションのニーズに適したタイムアウトを選択してください。
最初の接続では、loginTimeout
が使用されます。
loginTimeout
は、サーバーへの接続が確立されるまでドライバーが待機する時間 (秒単位) です。 この時間を超えると、エラーが返され、開いた接続は確立されません。 値 0 は、タイムアウトが既定のシステム タイムアウト (バージョン 11.2 以上では 30 秒) であることを示します。 バージョン 10.2 以下の場合、既定のタイムアウトは 15 秒です。 0 以外の値は、失敗した接続をタイムアウトするまでにドライバーが待機する秒数を示します。 JDBC ドライバーとの接続の確立に常に問題がある場合は、このタイムアウトを 90 秒 (または 120 秒) に増やすことが必要な場合があります。
接続が確立されると、ステートメントの実行中に queryTimeout
、cancelQueryTimeout
、lockTimeout
が使用されます。 socketTimeout
は、ドライバーとサーバーの通信に使用されます。
queryTimeout
は、サーバーに実行コマンドを送信してから、データを含む応答をサーバーから受信するまで、ドライバーが待機する時間 (秒単位) です。 この時間を経過すると、コマンドは取り消されます。 このタイムアウトを超えると、接続は閉じられません。 既定値は -1 です。これはタイムアウトが無期限であることを意味します。cancelQueryTimeout
は、接続を強制的に終了または閉じる前に、ドライバーがサーバーからの取り消しのqueryTimeout
受信確認を待機する時間 (秒単位) です。 つまり、ドライバーは、cancelQueryTimeout
とqueryTimeout
の合計秒数の間待機した後、接続を閉じます。 このタイムアウトを 0 以外の値に設定すると、クエリがタイムアウトしたときに、サーバーとのネットワークまたは通信エラーが発生した場合でも、アプリケーションの応答性を確実に維持できます。このプロパティの既定値は -1 で、これは無期限の待機時間です。lockTimeout
は、ステートメントの実行をブロックする lock がある場合、ロックを解放するまでに待機する時間です。 このタイムアウトを超えると、接続は閉じられません。 このプロパティの既定値は -1 で、これは無期限の待機時間です。socketTimeout
は、サーバーとのすべてのソケット通信に適用されます。 データの応答確認またはデータに対する応答を行わないことによってサーバー側でドライバーとの通信が停止された場合、ドライバーは、socketTimeout
の値の間待機した後、接続を閉じます。 このタイムアウトを 0 以外の値に設定すると、サーバーとのネットワークまたは通信エラーが発生しても、アプリケーションの応答性は確実に維持できます。 既定値は 0 です。これはタイムアウトが無期限であることを意味します。queryTimeout
ウィンドウでソケット タイムアウトの例外が発生しないように、socketTimeout
がqueryTimeout
より大きいことを確認します。 同様に、cancelQueryTimeout
ウィンドウでソケット タイムアウトの例外が発生しないように、socketTimeout
がcancelQueryTimeout
より大きいことを確認します。
アプリケーションの適正なタイムアウト値は、アプリケーションの優先順位によって異なります。 小さいタイムアウト値を設定すると、アプリケーションの応答性がデータの整合性よりも優先されます。 タイムアウトに達した場合、アプリケーションで最適なアクションを決定する必要があります。 この決定は、実行されているデータベース アクションに基づきます。 たとえば、SELECT
ステートメントの場合、この決定としては、ユーザーへのエラーの報告、または再接続と再試行が考えられます。 INSERT
または UPDATE
ステートメントの場合は、この決定が異なる可能性があります。
応答性の高いアプリケーションの場合、loginTimeout
と queryTimeout
を比較的低い値に設定する必要があります。 同様に、queryTimeout
を超えた場合にサーバーがクエリの取り消しを確認するまでドライバーが長時間待機することがないように、cancelQueryTimeout
も低い値に設定する必要があります。 最後に、socketTimeout
は、サーバーへの接続が切断されるシナリオ (ネットワークの中断、サーバーのクラッシュなど) でドライバーが長時間待機することがないように設定する必要があります。
プロパティの概要
プロパティ | 説明 | Default | 接続結果 |
---|---|---|---|
loginTimeout |
ドライバーがタイムアウトを通知して接続を失敗させるまでに待機する時間 (秒) です。 | 30 秒 [11.2 以上]、 それ以外の場合は 15 秒 |
閉じた接続 |
queryTimeout |
クエリを取り消すまでに待機する秒数。 | -1 [無期限のタイムアウト] | 開いた接続 |
cancelQueryTimeout |
QueryTimeout キャンセルの受信確認を待機する秒数。 | -1 [無期限のタイムアウト] | 閉じた接続 |
lockTimeout |
データベースによってロック タイムアウト エラーが返されるまでの待機ミリ秒数。 | -1 [無期限のタイムアウト] | 開いた接続 |
socketTimeout |
ソケットの読み取りまたは書き込みを待機するミリ秒数。 | 0 [無期限のタイムアウト] | 閉じた接続 |