|
|
WebOTX Manual V10.1 (第7版) 目次を表示 |
Transactionサービスのチューニングについて説明します。
以降の説明で、「設定方法」には、設定対象となる統合運用管理ツール上の項目名や、MOの属性名を記述しています。設定方法の詳細については、 マニュアル [ コンフィグレーション(設定一覧) > Transactionサービス > Transactionサービスに関する設定 ] を参照してください。
ここではトランザクションタイムアウト時間とObject Brokerのリクエスト呼び出しのタイムアウト時間の関係について、トランザクション実行中にサーバアプリケーションを呼び出さない場合とトランザクション実行中にサーバアプリケーションを呼び出す場合で分けて説明します。
なお、データベース等のリソースのタイムアウト設定はトランザクションタイムアウト時間を元にTransactionサービスで適宜変更しているので調整の必要はありません。
|
「トランザクションタイムアウト時間」
|
トランザクション実行中にサーバアプリケーションを呼び出さない場合
トランザクション実行中にサーバアプリケーションを呼び出さない場合とは、サーバアプリケーションでトランザクションを開始し、他のプロセス上のサーバアプリケーションを呼び出すことなくトランザクションが完結する場合のことです。自プロセス上のサーバアプリケーションの呼び出しもこの場合に該当します。
この場合は、クライアントで設定するサーバアプリケーションを呼び出す際の通信のタイムアウト時間より短い値をトランザクションタイムアウト時間に設定します。
これはクライアントからサーバへの呼び出しの中でトランザクションを実行するので、トランザクションのタイムアウトが発生した時点で通信のタイムアウトにより通信が切断されているとクライアントにトランザクションの成否を通知する手段が無くなるためです。
具体的にはクライアントで設定されるObject Brokerのリクエスト呼び出しのタイムアウト時間(RequestTimeout: 既定値30秒)より短い値をサーバのトランザクションタイムアウト時間に設定します。

トランザクション実行中にサーバアプリケーションを呼び出す場合
トランザクション実行中にサーバアプリケーションを呼び出す場合とは、クライアントアプリケーションでトランザクションを開始した後、サーバアプリケーションを呼び出し実行する場合、もしくはサーバアプリケーションでトランザクションを開始した後、他のプロセス上のサーバアプリケーションを呼び出し実行する場合のことです。
この場合は、クライアントからサーバアプリケーションを呼び出す際の通信のタイムアウト時間より長い値をトランザクションタイムアウト時間に設定します。
これはトランザクションの開始と終了の間でサーバの呼び出しが行われるため、いくら通信のタイムアウト時間を長くしてもトランザクションタイムアウト時間が経過した時点でトランザクションはロールバックしてしまうためです。
具体的にはクライアントで設定されるObject Brokerのリクエスト呼び出しのタイムアウト時間(RequestTimeout: 既定値30秒)より長い値をクライアントまたはサーバ(トランザクションを開始する方)のトランザクションタイムアウト時間に設定します。

サーバアプリケーションでトランザクションを開始し、統合運用管理ツールで設定する場合:
[WebOTX[<ホスト名>]]-[<ドメイン名>]-[server]-[transactionservice]-[TM設定]-[トランザクションタイムアウト時間]
サーバアプリケーションでトランザクションを開始し、運用管理コマンドで設定する場合:
otxadmin> set server.transactionservice.tx-timeout=600(秒)
クライアントアプリケーションでトランザクションを開始する場合:
Javaクライアントでは以下の形式でシステムプロパティを指定します。
-DTxTimeout=<トランザクションタイムアウト時間(秒)>
JDBCコネクションとEJBインスタンスの関連付け機能の無効化
EJBを利用する場合、トランザクションの開始(begin())の前に取得したJDBCコネクションをそのトランザクションに参加させることができます。 これは、EJBインスタンスとJDBCコネクションの関連付けを行っているためです。そうした制御を行う必要がない場合には、該当機能を無効に することで、トランザクションの実行性能を向上させることができます。
具体的には以下のようなケースで高速化が可能です。
トランザクションの開始前に取得したJDBCコネクションをそのトランザクションに参加させることはなく、JDBCコネクションの取得、及び、クローズがトランザクションの開始と終了の間で行なわれている。
| // JDBCコネクショとEJBインスタンスの関連付け機能が利用されるケース(高速化不可) UserTransaction utx = …; DataSource ds = …; Connection con = ds.getConnection(); utx.begin(); // コネクション(con)を利用したデータベース更新をここで行なう utx.commit(); con.close(); |
| // JDBCコネクショとEJBインスタンスの関連付け機能が利用されないケース(高速化可能) UserTransaction utx = …; DataSource ds = …; utx.begin(); Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう con.close(); utx.commit(); |
他のBeanを呼び出す前にJDBCコネクションをクローズし、JDBCコネクションの引継ぎを行わない。
| // Bean間でJDBCコネクションを引き継ぐケース(高速化不可) DataSource ds = …; Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう // 別Beanの呼び出し // コネクション(con)を利用したデータベース更新をここで行なう con.close(); |
| // Bean間でJDBCコネクションを引き継がないケース(高速化可能) DataSource ds = …; Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう con.close(); // 別Beanの呼び出し Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう con.close(); |
トランザクションの高速化は、${INSTANCE_ROOT}/config/TS/jta.confに以下を追加したあとドメイン再起動することにより行なうことができます。
wojta.enlistPrecreatedConnection=false