QueryTimeout の構成

アプリケーションのデータ・ソースに照会タイムアウトを構成することで、 Structured Query Language (SQL) ステートメントの実行が指定秒数内に完了しなかった場合 にステートメントが中断されるようにできます。

事前処理

Java Database Connectivity (JDBC) API は、 ステートメントの実行を JDBC ドライバーが待機する秒数を制限する標準インターフェース java.sql.Statement.setQueryTimeout を 提供します。 アプリケーションはこれを使用して、SQL ステートメントの 完了をアプリケーションが最大どれだけ待った後で要求を中断するのか を制御します。 WebSphere® Application Server では、照会タイムアウトをデータ・ソースに設定できるため、 java.sql.Statement.setQueryTimeout を直接呼び出すためにアプリケーションを変更する必要がありません。 各ステートメントで java.sql.Statement.setQueryTimeout インターフェースを呼び出すことによって、 アプリケーションで SQL 照会タイムアウトをプログラムで設定することも可能です。

このタスクの概要

この照会タイムアウトは、以下のカスタム・プロパティーのいずれかを使用して構成することができます。
  1. webSphereDefaultQueryTimeout はデフォルトの照会タイムアウトを設定します。これは、タイムアウトになる前に SQL ステートメントの実行にかかり得る秒数です。 このデフォルト値は、 syncQueryTimeoutWithTransactionTimeout カスタム・プロパティーが有効になっている場合、Java™ Transaction API (JTA) トランザクション中にオーバーライドされます。
  2. syncQueryTimeoutWithTransactionTimeout は、JTA トランザクションの残り時間があれば、それを SQL ステートメントのデフォルト照会タイムアウトとして使用します。
デフォルトでは、照会タイムアウトは無効になっています。 これら 2 つのデータ・ソース・カスタム・プロパティー の値の有無とその値に基づいて、タイムアウト値は次のいずれかのように計算されます。
  • トランザクション・マネージャー (TM) タイムアウト設定に基づく、現行 JTA トランザクションにおける残り時間 - syncQueryTimeoutWithTransactionTimeout
  • 構成により指定された絶対秒数 - webSphereDefaultQueryTimeout
計算されたタイムアウトは、その後、構成されたデータ・ソースを使用してアプリケーションが実行する 各 SQL ステートメントに照会タイムアウト値を設定するのに使用されます。

手順

  1. 管理コンソールを開きます。
  2. リソース > JDBC > データ・ソース > データ・ソース をクリックします
  3. 「追加プロパティー」の下の 「カスタム・プロパティー」 をクリックします。
  4. 「新規作成」をクリックします。
  5. 「名前」 フィールドに webSphereDefaultQueryTimeout と入力します。
  6. 「値」 フィールドに、デフォルトの照会タイムアウトに使用する秒数を入力します。
    タイムアウト値は 秒単位です。 値に 0 (ゼロ) を指定すると、タイムアウトは設けられません。
  7. 「OK」をクリックします。
  8. 「新規作成」をクリックします。
  9. 「名前」 フィールドに syncQueryTimeoutWithTransactionTimeout と入力します。
  10. 「値」 フィールドに true または false を入力します。
    値「true」は、JTA トランザクションの残り時間をデフォルトの照会タイムアウトとして使用することを示しています。
  11. 「OK」をクリックします。
  12. 変更を保存します。
    更新が有効となるのは、サーバーが再始動した後です。

結果

アプリケーションのデータ・ソース上で、照会タイムアウトの構成が完了しました。

以下の例は、データ・ソースのカスタム・プロパティー 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 インターフェースを呼び出すことで、ステートメントの照会タイムアウトはいつでもオーバーライドすることができます。