| 6. Transactionサービスのチューニング |
Transactionサービスのチューニングについて説明します。
以降の説明で、「設定方法」には、設定対象となる統合運用管理ツール上の項目名や、MOの属性名を記述しています。設定方法の詳細については、マニュアル「運用編(コンフィグレーション)」-「10.Transactionサービスに関する設定」を参照してください。
| 6.1. トランザクションタイムアウト時間について |
ここではトランザクションタイムアウト時間とObjectBrokerのリクエスト呼び出しのタイムアウト時間の関係について、トランザクション実行中にサーバアプリケーションを呼び出さない場合とトランザクション実行中にサーバアプリケーションを呼び出す場合で分けて説明します。
なお、データベース等のリソースのタイムアウト設定はトランザクションタイムアウト時間を元にTransactionサービスで適宜変更しているので調整の必要はありません。

トランザクション実行中にサーバアプリケーションを呼び出さない場合
トランザクション実行中にサーバアプリケーションを呼び出さない場合とは、サーバアプリケーションでトランザクションを開始し、他のプロセス上のサーバアプリケーションを呼び出すことなくトランザクションが完結する場合のことです。自プロセス上のサーバアプリケーションの呼び出しもこの場合に該当します。
この場合は、クライアントで設定するサーバアプリケーションを呼び出す際の通信のタイムアウト時間より短い値をトランザクションタイムアウト時間に設定します。
これはクライアントからサーバへの呼び出しの中でトランザクションを実行するので、トランザクションのタイムアウトが発生した時点で通信のタイムアウトにより通信が切断されているとクライアントにトランザクションの成否を通知する手段が無くなるためです。
具体的にはクライアントで設定されるObjectBrokerのリクエスト呼び出しのタイムアウト時間(RequestTimeout: 既定値30秒)より短い値をサーバのトランザクションタイムアウト時間に設定します。

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

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