WebLogic Server FAQ 集
![]() |
![]() |
![]() |
![]() |
Q. どうすれば MQSeries を分散トランザクション用の XA リソースとして WebLogic Server 内に取り込めますか。
A. 説明、サポート クラス、ユーティリティ、サンプルを備えた zip ファイルを BEA の dev2dev サイトの「Code Samples: WebLogic Server」ページからダウンロードできます。ftp://edownload:BUY_ME@ftpna2.bea.com/pub/downloads/wlsmqseries.zip
から直接パッケージをダウンロードすることもできます。
Q. 分散トランザクションで XA 以外のドライバを使用できますか。
A. XA 以外の接続プールが、複数のサーバに分散したトランザクションに参加している唯一のリソースである場合は、XA 以外のドライバの TxDataSource をコンフィグレーションする必要があります。
ただし、複数のリソースが分散トランザクションに参加する場合は、TxDataSource プロパティ EnableTwoPhaseCommit=true
も設定する必要があります。詳細については、Administration Console オンライン ヘルプの「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 ドライバの違いは以下のとおりです。
しかし、XA 以外のドライバは XAResource インタフェースを実装せず、2PC プロトコルにはフルに参加できません。分散トランザクションで XA 以外のドライバを使用する場合は、WLS がドライバの代わりに XAResource ラッパーを実装します。データ ソース プロパティ enableTwoPhaseCommit
が true
に設定されている場合、WLS XAResource ラッパーはトランザクション マネージャが prepare
メソッドを呼び出したときに XA_OK を返します。トランザクション マネージャが第 2 フェーズで commit()
または rollback()
を呼び出すと、WLS XAResource ラッパーは commit()
または rollback()
の呼び出しを XA 以外の JDBC 接続に委託します。commit()
または rollback()
の途中で障害が発生すると、ヒューリスティックな例外が発生します。ヒューリスティック エラーの結果、アプリケーション データは矛盾した状態のまま残される場合があります。
Q. WebLogic jDriver for Oracle/XA に加えてどの XA ドライバを使用できますか。
A. 理論的には、JDBC 2.0 規格の拡張仕様に準拠していればどのサードパーティ XA ドライバでも使用できます。ただし、個々のベンダの XA ドライバには、正しく機能することを妨げるバグがある場合もあります。
コンフィグレーションの詳細については、『WebLogic JDBC プログラマーズ ガイド』の「WebLogic Server でのサードパーティ ドライバの使い方」にある 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 Logic jDriver for Oracle XA が Oracle の OCI API と C XA スイッチを使用して実装され、マルチスレッド モードで OCI と XA を使用する場合に Oracle に問題があるためです。開かれたものとは異なる OCI カーソルをスレッドで閉じると、サーバのクラッシュや予期しない動作が発生する場合があります。結果として、WebLogic ドライバは呼び出しが呼び出し側に戻るときに開いているすべての結果セットを暗黙的に閉じます。
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 接続を取得できますか。
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 デバッグを有効にすることです。
![]() ![]() |
![]() |
![]() |