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. データ・ソースの「WebSphere Application Server データ・ソース・プロパティー」パネルに移動します。
    1. 「リソース」 > 「JDBC」 > 「データ・ソース」 > 「data_source」とクリックします。
    2. 「WebSphere Application Server データ・ソース・プロパティー」をクリックします。
  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 above operation took 5 seconds, remaining time = 30 - 5 seconds
    statement.executeUpdate(sqlcommand4); // query timeout of 25 seconds is used
    // assume the above 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 above operation took 5 seconds
    statement.executeUpdate(sqlcommand4); // query timeout of 20 seconds is used
    // assume the above 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 インターフェースを呼び出すことで、ステートメントの照会タイムアウトはいつでもオーバーライドすることができます。

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_querytimeout
ファイル名:tdat_querytimeout.html