8.6.4 トランザクションタイムアウトを設定する
ここでは,トランザクションタイムアウトの設定について説明します。トランザクションタイムアウトは,データベースシステムなどEISとのトランザクションに設定します。
DB Connectorを使用してデータベースにアクセスするときのトランザクションタイムアウトについて説明します。
トランザクションタイムアウトを設定する場合は,システム全体のタイムアウトのうち,EJBコンテナとデータベースのトランザクション(図の10のポイント)について意識する必要があります。なお,この番号は,図8-9または図8-10と対応しています。
トランザクションタイムアウトが発生すると,アプリケーションサーバによって,次の処理が実行されます。
-
実行中のトランザクションはロールバックされます。
-
トランザクションに参加しているコネクションはクローズされ,コネクションプールから削除されます。
- ポイント
-
トランザクションのタイムアウトは,CMTの場合とUserTransactionの場合で設定方法が異なります。
-
CMTの場合
CMTの場合,トランザクションのタイムアウトは,usrconf.propertiesで定義するか,またはEnterprise Bean,インタフェース,もしくはメソッドの属性として設定できます。Enterprise Bean,インタフェースまたはメソッドの属性は,サーバ管理コマンドで設定します。
usrconf.propertiesの定義は,プロセス全体に影響します。Enterprise Bean,インタフェースまたはメソッドの属性に設定したタイムアウトは,該当するEnterprise Bean,インタフェースまたはメソッドが使用するトランザクションの範囲だけに影響します。また,この指定は,usrconf.propertiesの定義よりも優先されます。
このため,プロセス全体に設定したい標準的な値をusrconf.propertiesに定義して,呼び出す業務によって細かく設定したい値はEnterprise Bean,インタフェース,またはメソッドの属性として設定することをお勧めします。
-
UserTransactionの場合
UserTransactionの場合,トランザクションのタイムアウトは,usrconf.propertiesまたはJTAのAPI(javax.transaction.UserTransaction#setTransactionTimeoutメソッド)に指定できます。
usrconf.propertiesの定義は,プロセス全体に影響します。APIに指定したタイムアウトは,APIを発行したトランザクションの範囲だけに影響します。また,APIの指定は,usrconf.propertiesの定義よりも優先されます。
このため,プロセス全体に設定したい標準的な値をusrconf.propertiesに定義して,呼び出す業務によって細かく設定したい値は適宜APIを使用して設定することをお勧めします。
-
- ポイント
-
トランザクションタイムアウトとコネクション取得に関連する設定値として,次のような関係が成り立つように設定してください。
トランザクションタイムアウト>コネクション枯渇時のコネクション取得要求のタイムアウト+障害検知タイムアウト+接続確立の最大待ち時間×コネクション取得実行回数+リトライ間隔×リトライ回数
これをパラメタで示すと次のようになります。
ejbserver.jta.TransactionManager.defaultTimeOut>RequestQueueTimeout+ejbserver.connectionpool.validation.timeout+loginTimeout×(RetryCount+1)+RetryInterval×RetryCount
また,トランザクションタイムアウトの設定値には,コネクション取得に掛かる時間以外にトランザクションの実行時間を加算する必要があります。
トランザクションタイムアウトが発生した場合,ユーザアプリケーションに例外は通知されません。ただし,メッセージKDJE31002-WがログファイルとJ2EEサーバのコンソールに出力されます。また,トランザクションタイムアウトが発生したあとで,ユーザアプリケーションから該当するトランザクションを使用してJTAインタフェースまたはJDBCインタフェースを使用しようとすると,例外が通知されます。