![]() |
![]() |
|
|
| |
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 ドライバの違いは以下のとおりです。
しかし、XA 以外のドライバは XAResource インタフェースを実装せず、2PC プロトコルにはフルに参加できません。分散トランザクションで XA 以外のドライバを使用する場合は、WLS がドライバの代わりに XAResource ラッパーを実装します。データ ソース プロパティ enableTwoPhaseCommit
が true
に設定されている場合、WLS XAResource ラッパーはトランザクション マネージャが prepare
メソッドを呼び出したときに XA_OK を返します。トランザクション マネージャが第 2 フェーズで commit()
または rollback()
を呼び出すと、WLS XAResource ラッパーは commit()
または rollback()
の呼び出しを XA 以外の JDBC 接続に委託します。commit
または rollback()
の途中で障害が発生すると、ヒューリスティックな例外が発生します。ヒューリスティック エラーの結果、アプリケーション データは矛盾した状態のまま残される場合があります。
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 接続を取得できますか。
分散トランザクションがコミットまたはロールバックされた後に 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 デバッグを有効にすることです。
![]() |
![]() |
![]() |