ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTAのプログラミング
12cリリース1 (12.1.1)
B65896-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のトランザクション・マネージャを駆動します。これは、トランザクションのインポートと呼ばれます。

トランザクションにおけるサード・パーティ・システムの調整(トランザクションのエクスポート)の詳細は、以下の節で説明します。サード・パーティ・システムが調整するトランザクションへの参加(トランザクションのインポート)の詳細は、第12章「サード・パーティ・トランザクション・マネージャで管理されるトランザクションへの参加」を参照してください。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://download.oracle.com/javaee/5/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 = ... ; // initialized to the initial context
    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 = ... ; // name of the RM instance
    XAResource res = ... ; // an XAResource instance of the RM instance
    tm.registerResource(name, res); // register a resource with the standard enlistment mode 
    

    または

    tm.registerDynamicResource(name, res); // register a resource with the dynamic enlistment mode 
    

    または

    tm.registerStaticResource(name, res); // register a resource with the static enlistment mode 
    

さまざまな登録モードの詳細については、「トランザクションにおける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 WebLogic Server APIリファレンスのweblogic.transaction.XAResourceに関する項を参照してください。

標準的な登録

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

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

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

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

    import weblogic.transaction.Transaction; // extends 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属性を介して構成できます。これは管理コンソールでは公開されていません。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 WebLogic Server APIリファレンスのweblogic.transaction.XAResourceに関する項を参照してください。

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

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

詳細は、『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 WebLogic Server APIリファレンスのweblogic.transaction.TransactionLoggerに関する項を参照してください。

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

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

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

    import weblogic.transaction.Transaction;
    import weblogic.transaction.TransactionHelper;
    Transaction tx = TransactionHelper.getTransaction();  // Get the transaction associated with the thread
    

    または

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

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

詳細は、Oracle WebLogic Server APIリファレンスweblogic.transaction.TxHelperを参照してください。

TxHelper.createXid

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

詳細は、Oracle WebLogic Server APIリファレンス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://www.oracle.com/technetwork/java/javaee/jta/index.htmlにあります。