ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55540-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

11 WebLogic Server トランザクション マネージャでの XAResource の調整

外部のサード パーティのシステムは、WebLogic Server トランザクション マネージャに javax.transaction.xa.XAResource 実装を登録することによって、WebLogic Server トランザクション マネージャが調整する分散トランザクションに参加できます。WebLogic Server トランザクション マネージャは、2 フェーズ コミット (2PC) プロトコルの一部として XAResource を駆動します。これを、「トランザクションのエクスポート」と言います。

サード パーティ トランザクション マネージャが XAResource インタフェースを実装している場合、トランザクションをエクスポートすることによって、サード パーティ トランザクション マネージャと WebLogic Server トランザクション マネージャを統合できます。エクスポートしたトランザクションによって、サード パーティ トランザクション マネージャは、WebLogic Server トランザクション マネージャの従属トランザクション マネージャとして機能できます。

WebLogic Server も、サード パーティ システム (外部トランザクション マネージャとも呼ばれる) が調整する分散トランザクションに参加できます。WebLogic Server の処理は、外部トランザクションの処理の一部として行われます。サード パーティ トランザクション マネージャは、コミット処理の一部として WebLogic Server のトランザクション マネージャを駆動します。これは、トランザクションのインポートと呼ばれます。

トランザクションにおけるサード パーティ システムの調整 (トランザクションのエクスポート) の詳細については、以下の節で説明します。サード パーティ システムが調整するトランザクションへの参加 (トランザクションのインポート) の詳細については、「サード パーティ トランザクション マネージャで管理されるトランザクションへの参加」を参照してください。WebLogic Server IIOP、WebLogic Tuxedo Connector (WTC) ゲートウェイ、および Oracle Java Adapter for Mainframe (JAM) ゲートウェイの内部では、その章で説明されているのと同じメカニズムにより、WebLogic Server におけるトランザクションのインポートおよびエクスポートが行われます。

以下の節では、サード パーティ システムをコンフィグレーションして、WebLogic Server トランザクション マネージャが調整するトランザクションに参加する方法について説明します。

外部 XAResource と分散トランザクションの調整の概要

WebLogic Server トランザクション マネージャが調整する分散トランザクションに参加するには、サード パーティのシステムで javax.transaction.xa.XAResource インタフェースを実装し、その XAResource オブジェクトを WebLogic Server トランザクション マネージャに登録する必要があります。javax.transaction.xa.XAResource インタフェースの実装に関する詳細については、以下の URL の Java Platform Enterprise Edition, v 5.0 API 仕様を参照してください。

http://java.sun.com/javaee/5/docs/api/javax/transaction/xa/XAResource.html

トランザクション処理時は、サード パーティ システムの XAResource オブジェクトを適切な各トランザクション オブジェクトに登録する必要があります。

図 11-1 は、WebLogic Server トランザクション マネージャが調整するトランザクションにサード パーティ システムが参加するプロセスを示したものです。

図 11-1 サード パーティ参加者と分散トランザクション

図 11-1 の説明については以下を参照
「図 11-1 サード パーティ参加者と分散トランザクション」の説明

XAResource オブジェクトをトランザクションに登録する際に使用する登録モードに応じて、WebLogic Server は、適切な時に XAResource オブジェクトを自動的に解放する場合があります。登録および解放の詳細については、「トランザクションにおける XAResource の登録と解放」を参照してください。XAResource オブジェクトを WebLogic Server トランザクション マネージャで登録する詳細については、「XAResource のトランザクションへの参加の登録」を参照してください。

XAResource のトランザクションへの参加の登録

WebLogic Server トランザクション マネージャが調整する分散トランザクションに参加するには、サード パーティのシステムで javax.transaction.xa.XAResource インタフェースを実装し、その XAResource オブジェクトを WebLogic Server トランザクション マネージャに登録する必要があります。以下の処理のために登録が必要となります。

XAResource 実装を WebLogic Server トランザクション マネージャに登録しないと、予期しないトランザクション ブランチ動作を引き起こす可能性があります。XA リソースが WebLogic Server 分散トランザクションに登録される前にこの登録を行わないと、WebLogic Server トランザクション マネージャはリソース名 (ブランチ修飾子) として XAResource インスタンスのクラス名を使用します。これによって、望ましくないリソース名やトランザクション ブランチの衝突が発生する可能性があります。

各リソース マネージャ インスタンスが、自身を一度だけ WebLogic Server トランザクション マネージャに登録するようにしてください。各リソース マネージャ インスタンスは登録時にリソース名によって識別されるので、回復、コミット処理、および状態モニタ時にシステムに過大なオーバーヘッドが加わり、関連する内部データ構造によって使用されるメモリが増加し、内部マップの検索効率が低下します。したがって、スケーラビリティおよびパフォーマンスの理由から、異なるトランザクション ブランチで XAResource インスタンスをむやみに登録しないようにする必要があります。

JTA XAResource では明示的なトランザクション モデルが採用されています。このモデルでは、Xid が常に XAResource メソッドで明示的に渡され、1 つのリソース マネージャ インスタンスがすべてのトランザクションを処理します。これは、暗黙的なトランザクション モデルが採用されている CORBA OTS リソースと対照的です。このモデルでは、参加対象の各トランザクションに対して異なる OTS リソース インスタンスが存在します。XAResource を設計する際は、JTA モデルを使用する必要があります。

各外部リソース マネージャ インスタンスは、サーバの起動時に WebLogic Server トランザクション マネージャに XAResource インスタンスを登録する必要があります。WebLogic Server では、起動クラスを使用して、外部トランザクション マネージャを登録できます。

WebLogic Server トランザクション マネージャにリソース マネージャを登録する手順は次のとおりです。

  1. JNDI または TxHelper インタフェースを使用して、WebLogic Server トランザクション マネージャを取得します。

    import javax.transaction.xa.XAResource;
    import weblogic.transaction.TransactionManager;
    import weblogic.transaction.TxHelper;
    InitialContext initCtx = ... ; // 初期コンテキストに初期化する
    TransactionManager tm = TxHelper.getTransactionManager();
    

    または

    TransactionManager tm = (TransactionManager)initCtx.lookup("weblogic.transaction.TransactionManager");
    

    または

    TransactionManager tm = (TransactionManager)initCtx.lookup("javax.transaction.TransactionManager");
    
  2. WebLogic Server トランザクション マネージャに XA リソース インスタンスを登録します。

    String name = ... ; // RM インスタンスの名前
    XAResource res = ... ; // RM インスタンスの XAResource インスタンス
    tm.registerResource(name, res); // 標準の登録モードでリソースを登録する 
    

    または

    tm.registerDynamicResource(name, res); // 動的登録モードでリソースを登録する 
    

    または

    tm.registerStaticResource(name, res); // 静的登録モードでリソースを登録する 
    

さまざまな登録モードの詳細については、「トランザクションにおける XAResource の登録と解放」を参照してください。XAResource の登録時に以降に使用される登録モードを指定しますが、その登録プロセスの間に実際にリソースを登録しているわけではありません。実際の登録は、(サーバ起動時ではなく) トランザクションで別の API を使用して行う必要があります。詳細については、「トランザクションにおける XAResource の登録と解放」を参照してください。

登録する各 XAResource インスタンスは、複数のトランザクションの回復およびコミット処理に並列的に使用されます。JTA 仕様バージョン 1.0.1B のセクション 3.4.6 で定義されているリソース共有を XAResource インスタンスがサポートしていることを確認してください。


注意 :

同じ XAResource の重複登録は無視されます。

リソースで新しいリクエストを受け付けなくなったら、WebLogic Server トランザクション マネージャから XAResource の登録を解除する必要があります。XAResource の登録を解除するには、次のメソッドを使用します。

tm.unregisterResource(name, res); 

トランザクションにおける XAResource の登録と解放

XAResource が分散トランザクションに参加するには、XAResource インスタンスをそのトランザクション オブジェクトに登録する必要があります。登録モードに応じて、異なる処理を実行する必要がある場合があります。WebLogic Server トランザクション マネージャでは、以下の登録モードがサポートされています。

XAResource はトランザクション オブジェクトに登録しますが、登録モードが決まるのは、リソースをトランザクションに登録する際ではなく、WebLogic Server トランザクション マネージャに XAResource を登録する際です。XAResource のトランザクションへの参加の登録」を参照してください。

XAResource.start および end の呼び出しは、コストがかかる場合があります。WebLogic Server トランザクション マネージャでは、これらの呼び出しの数を最小化するために以下の最適化方法が提供されています。

WebLogic Server トランザクション マネージャではデフォルトで、TMSUSPEND フラグが指定された XAResource.end を呼び出すことによって XAResource を解放します。TMSUSPEND が指定された XAResource.end が呼び出されると、カーソルが開いたままになるデータベース管理システムもあるので、可能な限り、TMSUCCESS を指定した XAResource.end を呼び出して XAResource を解放するようにしてください。これを行うには、javax.transaction.xa.XAResource の代わりに getDelistFlag メソッドが含まれる weblogic.transaction.XAResource インタフェースを実装します。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.XAResource」を参照してください。

標準的な登録

標準的な登録モードでは、トランザクション オブジェクトに XAResource インスタンスを登録するのは一度だけです。また、同じトランザクションに同じブランチの XAResource インスタンスを 2 つ以上登録することもできます。WebLogic Server トランザクション マネージャでは、すべての XAResource インスタンスに対して適切な場合に XAResource.end が呼び出されます (以下の説明を参照)。WebLogic Server トランザクション マネージャでは、トランザクションのコミット時に、各ブランチが準備とコミットの呼び出しのセットを 1 つだけ受け取ります。ただし、登録済みの特定の XAResource インスタンスの登録は無視されます。

標準的な登録では登録が簡素化されますが、特定のメソッド呼び出しの間の中でリソースが全くアクセスされない場合には、XAResource の不必要な登録および解放が生じる可能性もあります。

トランザクション オブジェクトに XAResource を登録するには、以下の手順に従います。

  1. TransactionHelper インタフェースを使用して現在のトランザクション オブジェクトを取得します。

    import weblogic.transaction.Transaction; // javax.transaction.Transaction を拡張する
    import weblogic.transaction.TransactionHelper;
    Transaction tx = TransactionHelper.getTransaction();
    
  2. トランザクション オブジェクトに XAResource インスタンスを登録します。

    tx.enlistResource(res);
    

XAResource をトランザクションに登録すると、WebLogic Server トランザクション マネージャによって、以降のすべての解放 (「トランザクションにおける XAResource の登録と解放」を参照) および再登録が管理されます。標準的な登録モードでは、WebLogic Server トランザクション マネージャは、以下の場合に同じトランザクションで XAResource を再登録します。

  • リクエストが実行される前。

  • 別のサーバから応答が受信された後 (WebLogic Server トランザクション マネージャは、別のサーバにリクエストを送信する前に XAResource を解放します)。

動的な登録

動的な登録モードでは、リソースの各アクセス前にトランザクション オブジェクトに XAResource インスタンスを登録する必要があります。この登録モードでは、各トランザクションに一度に登録できる XAResource インスタンスは、各トランザクション ブランチから 1 つのみです。WebLogic Server トランザクション マネージャは、最初のインスタンスが登録されてから解放されるまでの間、同じトランザクション ブランチの別の XAResource インスタンスの登録を無視します。

動的な登録では、XAResource インスタンスの登録と解放は最小限に抑えられます。

XAResource を登録する手順は、「標準的な登録」で説明した手順と同じです。

静的な登録

静的な登録モードでは、トランザクション オブジェクトに XAResource インスタンスを登録する必要はありません。XAResource は、以下のイベントの際に WebLogic Server トランザクション マネージャによって、すべてのトランザクションについて暗黙的に登録されます。

  • リクエストが実行される前。

  • 別のサーバから応答が受信された後。


    注意 :

    静的な登録モードを使用する前に以下の点を考慮する必要があります。
    • 静的な登録モードでは XAResource を登録する必要がない。ただし、リソースが特定のトランザクションで使用されない場合、不必要な登録および解放に繋がる可能性があります。

    • リソースがトランザクションで使用されない場合でも、問題のある XAResource によって、すべてのトランザクションが悪影響を受ける可能性がある。

    • 1 つの XAResource インスタンスを使用して異なるトランザクションとスレッドを一度に関連付ける。つまり、複数のスレッドの異なる Xid について、同じ XAResource インスタンス上で XAResource.start および XAResource.end を交互に呼び出すことができます。XAResource がこのような関連付けパターンをサポートするようにする必要があります。これは JTA 仕様では要求されていません。

    静的な登録は、パフォーマンスのオーバーヘッドが大きく、障害分離が不十分な上、トランザクションの関連付けに関する要件が厳しいため、十分に検討した上で慎重に使用する必要があります。


コミット処理

コミット処理の間、WebLogic Server トランザクション マネージャは、2 フェーズ コミットを行うため、トランザクション マネージャに登録されている XAResource インスタンスか、トランザクションに現在登録されている XAResource インスタンスのいずれかを使用します。WebLogic Server トランザクション マネージャでは、各トランザクション ブランチが準備とコミットの呼び出しのセットを 1 つだけ受け取ります。JTA 仕様バージョン 1.0.1B のセクション 3.4.6 で定義されているように、さまざまなスレッドから同時に複数のトランザクションのコミット処理を行うために、どのような XAResource インスタンスも使用できるようにする必要があります。

回復

WebLogic Server サーバが再起動されると、WebLogic Server トランザクション マネージャは自身のトランザクション ログ (正常に準備されたが、2PC 処理の第 2 コミット フェーズを終了していない可能性のあるトランザクションのログ記録) を読み込みます。WebLogic Server トランザクション マネージャは次に、これらのトランザクションの XAResource のコミットの再試行を続行します。「XAResource のトランザクションへの参加の登録」で説明したように、WebLogic Server トランザクション マネージャのリソース登録 API は、回復を目的とした XAResource インスタンスのブートストラップにも使用されます。サーバの再起動時に XAResource インスタンスが WebLogic Server トランザクション マネージャに登録されていることを確認する必要があります。WebLogic Server トランザクション マネージャは、有効な XAResource インスタンスが WebLogic Server トランザクション マネージャに登録されるまで、コミット呼び出しを毎分再試行します。

トランザクション コーディネータとして機能しているトランザクション マネージャがクラッシュすると、コーディネータのトランザクション ログにいくつかの不明なトランザクションが記録されないこともあります。したがって、コーディネータではサーバの再起動時に、リソース マネージャに対して XAResource.recover を呼び出し、記録されなかった不明なトランザクションをロールバックする必要があります。コミットの再試行と同様に、WebLogic Server トランザクション マネージャは、有効な XAResource インスタンスが WebLogic Server トランザクション マネージャに登録されるまで、5 分間隔で XAResource.recover を再試行します。

WebLogic Server トランザクション マネージャは、新しい XAResource が最初に WebLogic Server トランザクション マネージャに登録される際、トランザクション ログ レコードにそのチェックポイントを記録します。サーバの再起動時に、WebLogic Server トランザクション マネージャは、前にチェックポイントが記録され (トランザクション終了後にトランザクション ログ レコードから削除され) たすべてのリソースに対して XAResource.recover を呼び出します。リソースがチェックポイント記録から削除されるのは、最後の PurgeResourceFromCheckpointIntervalSeconds 間隔 (デフォルトは 24 時間) にアクセスされていない場合のみです。したがって、リソース回復のオーバーヘッドを軽減するには、WebLogic Server トランザクション マネージャに登録されているリソース マネージャ インスタンスの数を最小限にする必要があります。

XAResource.recover を実装する際は、以下に示す X/Open XA 仕様で説明されているようにフラグを使用する必要があります。

リソース状態モニタ

問題のある XAResource に対してサーバ スレッドを失わないように、WebLogic Server JTA には内部リソース状態モニタのメカニズムがあります。リソースがアクティブであると見なされるのは、保留中のリクエストが存在しない場合、または XAResource の保留中のリクエストの結果が XAER_RMFAIL ではない場合です。XAResource が 2 分以内にアクティブにならない場合、WebLogic Server トランザクション マネージャは XAResource を応答なしと宣言します。XAResource に対する新たなリクエストは拒否され、XAER_RMFAIL XAException が送出されます。

2 分という間隔は、maxXACallMillis JTAMBean 属性を介してコンフィグレーションできます。これは Administration Console ではエクスポーズされていません。maxXACallMillis は、config.xml ファイル内でコンフィグレーションできます。次に例を示します。

<Domain>
....<JTA
   MaxXACallMillis="240000"
/>
....</Domain>

WebLogic Server トランザクション マネージャから通知を受信し、リソースが応答なしと宣言されようとしている際に、本当に応答なしかどうかを WebLogic Server トランザクション マネージャに通知するには、weblogic.transaction.XAResource (javax.transaction.xa.XAResource を拡張) を実装し、これをトランザクション マネージャに登録します。トランザクション マネージャは、XAResource が利用できないことを宣言しようとする際に、その detectUnavailable メソッドを呼び出します。XAResource から true が返されると、利用できないと宣言されることはありません。XAResource が本当に利用できない場合には、この機会にクリーンアップおよびトランザクション マネージャへの再登録を行うこともできます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.XAResource」を参照してください。

Java EE コネクタ アーキテクチャのリソース アダプタ

WebLogic Server トランザクション マネージャに直接登録するほかに、Java EE コネクタ アーキテクチャのリソース アダプタ インタフェースを実装することもできます。リソース アダプタをデプロイする際、リソース マネージャの XAResource は、WebLogic Server Java EE コンテナによって WebLogic Server トランザクション マネージャに自動的に登録されます。

詳細については、『Oracle Fusion Middleware Oracle WebLogic Server リソース アダプタ プログラマーズ ガイド』を参照してください。

実装のヒント

以下の節では、WebLogic Server トランザクション マネージャでのトランザクションのエクスポートとインポートのヒントについて説明します。

WebLogic Server トランザクション ログの共有

WebLogic Server トランザクション マネージャは、ゲートウェイなどのシステム アプリケーションで共有されるようにトランザクション ログをエクスポーズします。これによって、高速ロギングのために WebLogic Server トランザクション マネージャの一括 (バッチ) 処理のトランザクション ログ最適化をシステム アプリケーションで利用できます。トランザクション ログ記録は適時に解放することが重要となります (WebLogic Server トランザクション マネージャは、トランザクション ログ ファイル内のすべての記録が解放された場合にのみトランザクション ログ ファイルを削除します)。これを行わないと、トランザクション ログ ファイルが多数作成され、コミット済みのトランザクションの多くが再コミットされ、極端なケースでは、循環衝突やトランザクション ログ ファイルの上書きが発生する可能性があります。

WebLogic Server トランザクション マネージャは、トランザクション ログ機能インタフェース weblogic.transaction.TransactionLogger をエクスポーズしています。これはサーバ上でのみ使用でき、以下の手順で取得できます。

  1. サーバ トランザクション マネージャを取得します。

    import weblogic.transaction.ServerTransactionManager;
    import weblogic.transaction.TxHelper;
    ServerTransactionManager stm = (ServerTransactionManager)TxHelper.getTransactionManager();
    
  2. TransactionLogger を取得します。

    TransactionLogger tlog = stm.getTransactionLogger();
    

XAResource のログ記録は、トランザクション ログに記録されるために、weblogic.transaction.TransactionLoggable インタフェースを実装する必要があります。weblogic.transaction.TransactionLogger インタフェース、および TransactionLogger インタフェースの用途に関する詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.TransactionLogger」を参照してください。

トランザクションのグローバル プロパティ

WebLogic Server JTA トランザクション オブジェクトは、ローカルおよびグローバルのプロパティに関連付けられます。グローバル プロパティは、トランザクション伝播コンテキストでサーバ間を伝播され、トランザクション ログにログ記録の一部としても保存されます。トランザクションのグローバル プロパティにアクセスするには、以下の手順に従います。

  1. トランザクション オブジェクトを取得します。

    import weblogic.transaction.Transaction;
    import weblogic.transaction.TransactionHelper;
    Transaction tx = TransactionHelper.getTransaction();  // スレッドに関連付けられたトランザクションを取得する
    

    または

    Transaction tx = TxHelper.getTransaction(xid); // 特定の Xid を持つトランザクションを取得する
    
  2. トランザクション オブジェクトのプロパティを取得または設定します。

    tx.setProperty("foo", "fooValue");
    tx.getProperty("bar");
    

詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.TxHelper」を参照してください。

TxHelper.createXid

TxHelper.createXid(int formatId, byte[] gtrid, byte[] bqual) メソッドを使用すると Xid を作成できます。作成した Xid は、たとえば、回復時に WebLogic Server トランザクション マネージャに返すことができます。

詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.TxHelper」を参照してください。

リソース登録名の変更点

このリリースでは、XA データ ソース コンフィグレーションのリソース登録名の動作が変更されました。以前のリリースでは、JTA の登録名はデータ ソースの名前のみでした。今後は、データ ソース名とドメインの組み合わせになります。

JTA に登録されたすべてのリソースには、対応する実行時 MBean が存在し、MBean を通じてそのリソースの XA 使用状況の統計が公開されます。今回の変更により、MBean の JMX ObjectName が変わる (修飾される) ため、既存のアプリケーションでそのような実行時 MBean の JMX ルックアップを名前に基づいて実行している場合は、何らかの影響を受ける可能性があります。旧リリースでは、ドメイン mydomainmydatasource という名前を持つデータ ソース コンフィグレーションの場合、JTA リソースの実行時 MBean は、次のようなオブジェクト名で登録されていました。

com.bea:ServerRuntime=myserver,Name=mydatasource,Type=TransactionResourceRuntime,JTARuntime=JTARuntime

このリリースでは、次のように修飾されたオブジェクト名が使用されます。

com.bea:ServerRuntime=myserver,Name=mydatasource_mydomain,Type=TransactionResourceRuntime,JTARuntime=JTARuntime

トランザクション ブランチ修飾子は、JTA リソース登録名からも派生します。そのため、アップグレード時に存在する XA データ ソースの保留トランザクション ブランチは、アップグレード後に回復できないことがあります。アップグレードは、データベース リソースに保留トランザクションが残っていない状態で実行することをお勧めします。保留データベース トランザクションが残っていると、場合によってはデータベース管理者がそれらを手動で解消することが必要になります。

このリリースでは、登録名の修飾を無効にするための次のようなシステム プロパティが新たに使用できるようになりました。

-Dweblogic.jdbc.qualifyRMName=false

FAQ

JTA に関するその他のドキュメント

接続ベースのリソース使用のシナリオについては、JTA 仕様 1.0.1B のセクション 4.1 を参照してください。トランザクション マネージャとリソース マネージャの間の JTA 対話について説明されています。JTA 仕様は http://java.sun.com/products/jta/ で参照できます。