QueryTimeout の構成
アプリケーションのデータ・ソースに照会タイムアウトを構成することで、 Structured Query Language (SQL) ステートメントの実行が指定秒数内に完了しなかった場合 にステートメントが中断されるようにできます。
事前処理
java.sql.Statement.setQueryTimeout
を
提供します。 アプリケーションはこれを使用して、SQL ステートメントの
完了をアプリケーションが最大どれだけ待った後で要求を中断するのか
を制御します。 WebSphere® Application Server では、照会タイムアウトをデータ・ソースに設定できるため、 java.sql.Statement.setQueryTimeout
を直接呼び出すためにアプリケーションを変更する必要がありません。 各ステートメントで java.sql.Statement.setQueryTimeout
インターフェースを呼び出すことによって、
アプリケーションで SQL 照会タイムアウトをプログラムで設定することも可能です。このタスクの概要
webSphereDefaultQueryTimeout
はデフォルトの照会タイムアウトを設定します。これは、タイムアウトになる前に SQL ステートメントの実行にかかり得る秒数です。 このデフォルト値は、syncQueryTimeoutWithTransactionTimeout
カスタム・プロパティーが有効になっている場合、Java™ Transaction API (JTA) トランザクション中にオーバーライドされます。syncQueryTimeoutWithTransactionTimeout
は、JTA トランザクションの残り時間があれば、それを SQL ステートメントのデフォルト照会タイムアウトとして使用します。
- トランザクション・マネージャー (TM) タイムアウト設定に基づく、現行 JTA トランザクションにおける残り時間 -
syncQueryTimeoutWithTransactionTimeout
- 構成により指定された絶対秒数 -
webSphereDefaultQueryTimeout
手順
- 管理コンソールを開きます。
- をクリックします
- 「追加プロパティー」の下の 「カスタム・プロパティー」 をクリックします。
- 「新規作成」をクリックします。
- 「名前」 フィールドに
webSphereDefaultQueryTimeout
と入力します。 - 「値」 フィールドに、デフォルトの照会タイムアウトに使用する秒数を入力します。タイムアウト値は 秒単位です。 値に 0 (ゼロ) を指定すると、タイムアウトは設けられません。
- 「OK」をクリックします。
- 「新規作成」をクリックします。
- 「名前」 フィールドに
syncQueryTimeoutWithTransactionTimeout
と入力します。 - 「値」 フィールドに true または false を入力します。値「true」は、JTA トランザクションの残り時間をデフォルトの照会タイムアウトとして使用することを示しています。
- 「OK」をクリックします。
- 変更を保存します。更新が有効となるのは、サーバーが再始動した後です。
結果
例
webSphereDefaultQueryTimeout = 20
および syncQueryTimeoutWithTransactionTimeout = true
を設定した場合の影響を示しています。 両方のプロパティーが設定されているため、JTA トランザクションの外
で実行される (transaction.begin()
および transaction.commit()
の
呼び出しによって境界が定められる) SQL ステートメントは webSphereDefaultQueryTimeout
で
設定されたデフォルトのタイムアウト値を使用することに注意してください。 JTA トランザクション内のステートメントは、トランザクション・タイムアウトが満了するまでの残りの
時間を使用します。statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // query timeout of 20 seconds is used
statement.executeUpdate(sqlcommand2); // query timeout of 20 seconds is used
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
statement.executeUpdate(sqlcommand3); // query timeout of 30 seconds is used
// assume the preceding operation took 5 seconds, remaining time = 30 - 5 seconds
statement.executeUpdate(sqlcommand4); // query timeout of 25 seconds is used
// assume the preceding operation took 10 seconds, , remaining time = 25 - 10 seconds
statement.executeUpdate(sqlcommand5); // query timeout of 15 seconds is used
}
finally
{
transaction.commit();
}
statement.executeUpdate(sqlcommand6); // query timeout of 20 seconds is used
以下の例は、データ・ソースのカスタム・プロパティー webSphereDefaultQueryTimeout = 20
および syncQueryTimeoutWithTransactionTimeout = false
を設定した場合の影響を示しています。 webSphereDefaultQueryTimeout
のみが
設定されている場合、ステートメントが JTA トランザクション内で実行されるかどうかに関係なく、すべてのステートメントで
デフォルトのタイムアウト値が使用されます。statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // query timeout of 20 seconds is used
statement.executeUpdate(sqlcommand2); // query timeout of 20 seconds is used
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
statement.executeUpdate(sqlcommand3); // query timeout of 20 seconds is used
// assume the preceding operation took 5 seconds
statement.executeUpdate(sqlcommand4); // query timeout of 20 seconds is used
// assume the preceding operation took 10 seconds
statement.executeUpdate(sqlcommand5); // query timeout of 20 seconds is used
}
finally
{
transaction.commit();
}
statement.executeUpdate(sqlcommand6); // query timeout of 20 seconds is used
ご使用のアプリケーション・コードから java.sql.Statement.setQueryTimeout
インターフェースを呼び出すことで、ステートメントの照会タイムアウトはいつでもオーバーライドすることができます。