ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     FAQ   |   前へ   |   次へ   |   目次   |   PDF 版

FAQ: JTA

 


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

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

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


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

できません。両方の接続プールの 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>"

という例外になります。


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

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


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

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

コンフィグレーションの詳細については、http://edocs.beasys.co.jp/e-docs/wls61/adminguide/managetx.html で JDBC コンフィグレーションのガイドラインを参照してください。


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

Oracle 8.1.6 Thin ドライバには外部 Xid を受け付けないバグがあるので、WLS を含む他のすべてのベンダのトランザクション マネージャでまったく機能しません。

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

次善策を利用せずに SP1 で試してみる場合は、XA 接続プールをコンフィグレーションできます。詳細については、『管理者ガイド』の「JDBC 接続の管理」を参照してください。


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

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

Weblogic jDriver for Oracle には、メソッドが呼び出し側に戻ったときに開いているすべての結果セットを閉じるという制限があります。詳細については、「分散トランザクションでの WebLogic jDriver for Oracle/XA の使い方」の「WebLogic jDriver for Oracle XA の制限」を参照してください。

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

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


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

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


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」という例外で、トランザクションのコミットが失敗します。

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


EJB CMP 1.1 を使用している場合に例外が送出されるのはなぜですか。

問題 : EJB CMP 1.1 および XA 以外の接続プールとともに分散トランザクションを使用しています。JDBC 接続プールと TxDataSource は、「 分散トランザクションで XA 以外のドライバを使用できますか。」の指示どおりにコンフィグレーションしました。それでも、コミット時には、「javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit」という例外が送出されます。なぜでしょうか。

旧式の CMP 1.1 DTD では、データ ソース名を指定できません。接続プール名だけが指定されている場合、TxDataSource の EnableTwoPhaseCommit 設定は無視されます。新しい CMP 1.1 DTD を使用し、プール名の代わりにデータ ソース名を指定する必要があります。http://www.bea.com/servers/wls600/dtd/weblogic-rdbms11-persistence-600.dtd を参照してください。


EJB CMP 1.1 と XA 接続プールを使用しているときに例外が送出されるのはなぜですか。

問題 : EJB CMP 1.1 および 2 つの XA 接続プールとともに分散トランザクションを使用しています。XA JDBC 接続プールと TxDataSource は、『管理者ガイド』の「JDBC 接続の管理」の指示どおりにコンフィグレーションしました。しかし、次の例外を受け取りました。「Couldn't get connection:java.sql.SQLException:Connection has already been created in this tx context for pool named <pool name> Pool.Illegal attempt to create connection from another pool:<pool name> Pool」。なぜでしょうか。

回答 : 旧式の CMP 1.1 DTD では、データ ソース名を指定できません。接続プール名しか指定されない場合、非 XA 接続プールのコード パスが誤って代わりに実行されてしまいます。新しい CMP 1.1 DTD を使用し、プール名の代わりにデータ ソース名を指定する必要があります。

記述子が最新の DTD ファイルを使用するようにするには、WebLogic CMP 1.1 記述ファイルの DOCTYPE ヘッダが次のとおりであることを確認してください。

<!DOCTYPE weblogic-rdbms-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB 1.1 RDBMS Persistence//EN'
http://www.bea.com/servers/wls600/dtd/weblogic-rdbms11-persistence-600.dtd'>

DTD ファイルを見るには、http://www.bea.com/servers/wls600/dtd/weblogic-rdbms11-persistence-600.dtd にアクセスしてください。


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

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


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

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


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

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

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

リソースが再びアクティブであると宣言されるのは、weblogic.transaction.TransactionManager.unregisterResource に続いて registerStaticResource または registerDynamicResource を呼び出して XAResource を WebLogic Server Transaction Manager に再登録した場合か、または 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 page next page