BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic Server FAQ 集

 Previous Next Contents PDF で侮ヲ  

FAQ: JTA

Q. どうすれば MQSeries を分散トランザクション用の XA リソースとして WebLogic Server 内に取り込めますか。

A. 説明、サポート クラス、ユーティリティ、サンプルを備えた zip ファイルを BEA の dev2dev サイトの「code samples for weblogic server」ページからダウンロードできます。

Q. 分散トランザクションで XA 以外のドライバを使用できますか。

A. XA 以外の接続プールが、複数のサーバに分散したトランザクションに参加している唯一のリソースである場合は、XA 以外のドライバの TxDataSource をコンフィグレーションする必要があります。

ただし、複数のリソースが分散トランザクションに参加する場合は、TxDataSource プロパティ EnableTwoPhaseCommit=true も設定する必要があります。詳細については、『管理者ガイド』の「JDBC 接続の管理」を参照してください。どちらの場合でも、常に、非推奨の DriverManager インタフェースではなく DataSource インタフェースを通じて接続を取得します。DriverManager を通じて接続を取得した場合、インタフェースでは TxDataSource の EnableTwoPhaseCommit 設定を取得できません。その場合は、分散トランザクションで予期しない動作が発生する場合があります。また、DataSource インタフェースを使用する場合は、URL または特定の WebLogic 多層ドライバ (JTS、RMI、またはプール) を区別する必要がありません。URL および特定のドライバは、config.xml ファイルおよび JNDI ルックアップを通じて取得されます。

Q. 分散トランザクションで複数の XA 以外の接続プールを使用できますか。

A. できません。両方の接続プールの TxDataSource で EnableTwoPhaseCommit=true を設定しても、同じ分散トランザクションで 2 つの XA 以外の接続プールを使用しようとすると、2 番目の XA 以外の接続プールから接続を取得しようとしたときに、

"java.sql.SQLException: Connection has already been created in this tx context for pool named <first pool's name>.Illegal attempt to create connection from another pool: <second pool's name>"

という例外になります。

Q. 分散トランザクションでの XA ドライバと XA 以外のドライバの違いは何ですか。

A. XA JDBC ドライバと XA 以外の JDBC ドライバの違いは以下のとおりです。

Q. WebLogic jDriver for Oracle/XA に加えてどの XA ドライバを使用できますか。

A. 理論的には、JDBC 2.0 規格の拡張仕様に準拠していればどのサードパーティ XA ドライバでも使用できます。ただし、個々のベンダの XA ドライバには、正しく機能することを妨げるバグがある場合もあります。

コンフィグレーションの詳細については、../adminguide/managetx.html で JDBC コンフィグレーションのガイドラインを参照してください。

Q. 分散トランザクションで、Oracle Thin ドライバを XA ドライバとして使用できますか。

A. Oracle 8.1.7 Thin ドライバにはスレッド処理に関する問題があるため、BEA では、次の解決策を考えました。この解決策では、準備、コミット、およびロールバックの処理期間に専用の XA 接続を使用します。これは、XAResource オブジェクトが任意数のトランザクションを平行してコミットするために使用されるという点で、デフォルトの XA 接続管理モデルとは異なります。このため、同時コミットの数が XA 接続プールの最大容量に制限されます。この次善策は Oracle 専用であるため、他の XA ドライバには影響しません。

Q. SQLException「Result set already closed」メッセージが表示されるのはなぜですか。

問題 : クライアント サイドから WebLogic jDriver for Oracle/XA (トランザクション モード) を使用しています。分散トランザクションでの更新は正常に機能します。しかし、クエリを実行しようとすると、「SQLException Result set already closed」というメッセージが表示されます。どうしたら回避できますか。

A. WebLogic jDriver for Oracle には、メソッドが呼び出し側に戻ったときに開いているすべての結果セットを閉じるという制限があります。

Bean など、サーバサイドからドライバを使用する場合、このような制限はありません。サーバサイドからドライバを使用することは、アプリケーション アーキテクチャやパフォーマンスの観点からも推奨されます。クライアントサイドからドライバを使用すると、すべての JCBC 呼び出しで往復のコストがかかります。

この制限があるのは、Web L ogic jDriver for Oracle XA が Oracle の OCI API と C XA スイッチを使用して実装され、マルチスレッド モードで OCI と XA を使用する場合に Oracle に問題があるためです。開かれたものとは異なる OCI カーソルをスレッドで閉じると、サーバのクラッシュや予期しない動作が発生する場合があります。結果として、Web L ogic ドライバは呼び出しが呼び出し側に戻るときに開いているすべての結果セットを暗黙的に閉じます。

Q. JMS と 1 つの XA 以外の JDBC ドライバを使用する場合に 2PC ライセンスは必要ですか。

A. 必要です。JMS も、分散トランザクションに参加する XAResource です。したがって、分散トランザクションには 2 つのリソースが参加しているので、2PC ライセンスが必要です。

Q. JMS と XA 以外のドライバを使用している場合に例外が送出されるのはなぜですか。

問題 : JMS と 1 つの XA 以外の JDBC ドライバを使用しています。「javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit」という例外で、トランザクションのコミットが失敗します。

A. 前の質問のJMS と 1 つの XA 以外の JDBC ドライバを使用する場合に 2PC ライセンスは必要ですか。で言及したように、JMS も分散トランザクションに参加する XAResource です。分散トランザクションに複数のリソースが参加している場合は、「分散トランザクションで XA 以外のドライバを使用できますか。」で説明されているようにデータ ソース プロパティ EnableTwoPhaseCommit=true を設定する必要があります。

Q. 分散トランザクションを開始する前に JDBC 接続を取得できますか。

A. ドライバが XA であるかどうかによって異なります。

Q. 分散トランザクションがコミットまたはロールバックされた後に JDBC 接続を閉じることができますか。

A. XA 以外のドライバと XA ドライバのどちらの場合でも、分散トランザクションが完了した後に接続を閉じることができます。

Q. XAResource にアクセスしたときに、「Internal error: XAResource '<name>' is unavailable」という XAER_RMFAIL XAException を受け取りました。これは何を意味しているのですか。また、どのように処理すればいいのですか。

A. JTA には、次の機能を備えた独自のリソース モニタが用意されています。

リソースがアクティブであると見なされるのは、保留中の要求が存在しない場合、または XAResource の保留中の要求から XAER_RMFAIL ではない結果を取得した場合です。XAResource が 2 分以内にアクティブにならない場合、XAResource は応答なしと宣言されます。XAResource に対する新たな要求は拒否され、上記のような XAER_RMFAIL XAException が送出されます。この目的は、RM が応答なし状態の場合にスレッドのさらなる損失を防ぐことです。

リソースが再びアクティブであると宣言されるのは、weblogic.transaction.TransactionManager.unregisterResource に続いて registerStaticResource または registerDynamicResource を呼び出して XAResource を WebLogic Server トランザクション マネージャに再登録した場合か、または 30 分のタイムアウト期間の経過後です。WLS JDBC 接続プールを使用する場合、JDBC 接続プールのリフレッシュ機能を有効にする (接続プールの「RefreshMinutes」プロパティを指定する) だけで済みます。接続プールのリフレッシュに成功すると、対応する XAResource が自動的に再登録されます。weblogic.transaction.TransactionManager.registerStaticResource または registerDynamicResource API のいずれかを介して独自の XAResource を登録する場合、weblogic.transaction.TransactionManager.unregisterResource に続いて registerStaticResource または registerDynamicResource を呼び出して XAResource を再登録する必要があります。

一般に、起こりうる RM 問題をデバッグする方法は、WLS の起動時に JVM パラメータとして -Dweblogic.Debug=weblogic.JTAXA を指定することによって JTA XA デバッグを有効にすることです。

 

Back to Top Previous Next