IBM Support

WAS: ServerIOTimeout発生時のリソースの開放に関して

技術情報(FAQs)


質問

001C9D46【WAS PluginのServerIOTimeoutを60秒に設定する想定です。もし、処理で60秒以上かかった場合、ServerIOTimeoutが発生すると思いますが、その場合Webコンテナのスレッドは開放されますか?】

回答

<<< QUESTION >>> 2014/01/09 14:27:50
<環境>
WebSphere Application Server (WAS)
-OS: AIX V7.1 TL3
-WASのエディション: Network Deployment
-WASのバージョン: 8.5.5

IBM HTTP Server (IHS)
-OS: AIX V7.1 TL3
-IHSのバージョン: 8.5.5

<背景>

システム全体のタイムアウト設計にあたっての質問です。


Q1)
IHS->WAS->DB2という構成で、WAS PluginのServerIOTimeoutを60秒に設定する想定です。
もし、(アプリケーションおよび)DB処理で60秒以上かかった場合、ServerIOTimeoutが発生すると思いますが、その場合Webコンテナのスレッドは開放されますか(アプリケーションのエラー終了)?


Q2)
上記で開放されない場合は、WAS側で長時間のSQL処理に対してタイムアウトを発生させるような仕組み(パラメータ等)はありますか?


<<< ANSWER >>> 2014/01/15 10:57:10

A1)
ご質問のケースでは、アプリケーションおよびDB処理で60秒を超える時間がかかった場合、
ご認識の通りServerIOTimeoutが発生しますが、スレッドは開放されません。


○InfoCenter「Web サーバー・プラグイン用の Application Server プロパティー設定

値を選択してこのフィールドを指定する場合は、アプリケーション・サーバーによる要求の処理に数分かかる可能性があります。
値を低く設定しすぎると、プラグインが偽のサーバー・エラー応答をクライアントに送信してしまうことがあります。

また、アプリケーションおよびDB処理が長時間かかったことにより、ServerIOTimeoutが発生した際の懸念事項として、以下の点が挙げられます。

1) 他の要求への影響
(ServerIOTimeout属性を負の値に設定した場合)プラグインが該当のサーバーをダウンとマークしてしまうため、他の要求が該当サーバーに割り振られなくなり、パフォーマンスの低下の可能性があります。

下記リンクに、設定値とタイムアウト発生後の挙動についての記載があります。
○InfoCenter「 plugin-cfg.xml ファイル」 - ServerIOTimeout
WAS V7.0.0.3以降:ServerIOTimeoutに負の値を設定する際の考慮点 (WAS-11-007)
-- 引用(InfoCenter「plugin-cfg.xml ファイル」) --
ServerIOTimeout 属性を正の値に設定した場合、サーバーへのこの接続試行は、タイムアウトが発生すると終了します。ただし、サーバーは接続不可と見なされないため、これ以降の要求もタイムアウトが発生したサーバーに引き続き送信されます。

ServerIOTimeout 属性を負の値に設定した場合、タイムアウトが発生するとサーバーは接続不可と見なされるため、これ以降の要求はタイムアウトが発生したサーバーに送信されません。

ServerIOTimeout 属性に値が設定されていない場合は、デフォルトでは、プラグインはブロック入出力を使用して、アプリケーション・サーバーとの間で要求の書き込みおよび応答の読み取りを行い、TCP 接続をタイムアウトさせません。

2) DB更新系処理が二重に実施される
クラスター構成の場合、プラグインが他のサーバーに自動的に要求を再送するため、DB更新系の処理の場合は二重にDB更新処理が行われる可能性があります。
アプリケーションでの二重更新の防止ロジックが実装されていない場合は、PostBufferSizeを0に設定することでPostリクエストに関しては再送しなくなります。
WAS虎の巻: 第5回「リクエスト処理の流れ」 - 3.2. WASへのリクエスト転送


A2)
以下のデータソース・カスタム・プロパティーのいずれかを使用して、アプリケーションのデータソースに照会タイムアウトを構成することができます。
  • webSphereDefaultQueryTimeout(non-XAの場合)
  • syncQueryTimeoutWithTransactionTimeout (XAの場合)

アプリケーション側で java.sql.Statement.setQueryTimeout インターフェースを呼び出すことで、ステートメントの照会タイムアウトはいつでもオーバーライドすることができます。
○InfoCenter「 QueryTimeout の構成

また、Type4のDB2 JDBCドライバ(db2jcc.jar/db2jcc4.jar)をご使用であれば、blockingReadConnectionTimeoutパラメータを設定することで、一定時間経過後にWAS側でタイムアウトさせることができるようになります(デフォルト値は0=SQL実行時間は無制限)。
○DB2 V10.5 InfoCenter「 サポートされるすべてのデータベース製品に共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー」 - blockingReadConnectionTimeout
※接続先DB2サーバー/JDBCドライバのバージョンが明記されていませんので、最新のDB2 V10.5のマニュアルリンクを添付します
======
(抜粋)
blockingReadConnectionTimeout
接続ソケットの読み取りがタイムアウトになるまでの秒単位の時間。 このプロパティーは IBM Data Server Driver for JDBC and SQLJ タイプ 4 接続にのみ適用され、接続が正常に確立した後でデータ・ソースに送信されるすべての要求に影響を与えます。 デフォルトは 0 です。0 の値は、タイムアウトがないことを意味します。
======
   
アプリケーション側でsetQueryTimeout()メソッドを利用したり、WASデータ・ソースのカスタム・プロパティーとしてwebSphereDefaultQueryTimeoutを設定することでSQL処理のタイムアウトを発生させることはできます。
ただし考慮点として、DBサーバ側が過負荷となりSQLのキャンセル処理に即時対応できない状況となっている場合には、想定する時間にてタイムアウトさせることはできませんので、接続先がDB2で、JDBC Type4ドライバをご使用であれば、blockingReadConnectionTimeoutパラメータのほうが要件に即するケースも多いです。
要件と照らし合わせ、適する設定をご検討ください。


<<< QUESTION >>> 2014/01/17 10:37:36

Q3)
Oracle DBとのJDBC接続においても、WASデータ・ソースのカスタム・プロパティーwebSphereDefaultQueryTimeoutは有効に動作すると考えて良いでしょうか?


<<< ANSWER >>> 2014/01/20 9:55:36

A3)
はい。ご指摘の通り、Oracle DBとのJDBC接続においても有効です。
WASのデータ・ソースにQueryTimeoutのデフォルト値を設定するプロパティですので、DB2に限らず使用することができます。


<<< Supplement(Answer) >>> 2014/01/20 13:27:35

JDBCドライバー タイムアウト関連パラメータについてのテクニカルフラッシュが発行されましたので、ご紹介いたします。
IBM DB2 JDBCドライバー タイムアウト関連パラメータ(DM-14-004) ...


以上

Historical Number

30555CF62FFFF0B749257CDE00214DDC

別名・略称

WAS\WAS

Document information

More support for: WebSphere Application Server

Software version: 8.5.5

Operating system(s): AIX

Reference #: J1012104

Modified date: 12 September 2014


Translate this page: