ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     WebLogic JTA プログラマーズ ガイド   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

WebLogic Server XA リソース プロバイダの要件

 

BEA WebLogic Server では Java Transaction API(JTA)がサポートされており、XA 準拠のリソースを使用して分散トランザクションを調整するトランザクション マネージャを備えています。この章では、WebLogic Server で分散トランザクションに参加する上での XA リソースの要件について説明します。この情報は、サードパーティ アプリケーションのインテグレータ向けに書かれたものです。

JTA の詳細については、Sun Microsystems 発行の Java Transaction API(JTA)仕様バージョン 1.0.1 を参照してください。

 


XA リソース プロバイダ要件の概要

XA リソース プロバイダは、WebLogic Server での分散トランザクションへの参加を可能にするため、スレッド アフィニティ制限のない JTA XAResource インタフェースをサポートしている必要があります。

非 JDBC リソースについては、以下の作業もリソース プロバイダが行います。

 


トランザクション マネージャへの登録

JTA 仕様では、XA リソースをサーバのトランザクション マネージャにブートストラップする方法は定義されていません。そのため、WebLogic Server では登録用の API が定義されています。

XA リソース プロバイダでは、起動時にローカル トランザクション マネージャに XAResource 実装を登録するため、次の手順が実行されます。

  1. JNDI または TxHelper インタフェースを使用して、JTA トランザクション マネージャを取得します。次のコードは、TxHelper インタフェースを使用して現在のトランザクション マネージャを取得する方法を示しています。

    import javax.transaction.xa.XAResource;
    import javax.transaction.TransactionManager;
    import weblogic.transaction.TxHelper;

    TransactionManager tm = TxHelper.getTransactionManager();

  2. JTA トランザクション マネージャに XA リソースを登録します。

    XAResource res = ...// リソース プロバイダによる XAResource の実装

    tm.registerStaticResource(name, res); // 静的なリソースの取得
    tm.registerDynamicResource(name, res2); // 動的なリソースの取得

    リソース プロバイダは、静的または動的な登録メソッドを使用して名前と実装を提供します。静的および動的な取得についての詳細は、 XAResource の取得と解放を参照してください。

    リソース名によってトランザクション ブランチが決まります。リソースが複数のインスタンスをサポートする場合、それぞれのリソース インスタンスは異なる名前を使用する必要があります。このリソース名は管理にも使用されます。

    XA リソースは、トランザクション作業で取得するよりも前に、トランザクション マネージャに登録されている必要がある点に注意してください。

  3. JTA トランザクション マネージャから、XA リソースを登録解除します。

    XAResource res = _ // リソース プロバイダによる XAResource の実装

    tm.unregisterResource(name);

    現在のサーバ上でこの名前に関連付けられているリソース プロバイダが登録解除されます。このリソースに未処理のトランザクションがある場合、リソースの登録を解除すると、トランザクションはロールバックされ、トランザクション ブランチは破棄されます。

 


XAResource の取得と解放

JTA アーキテクチャでは、トランザクション マネージャでのリソースの暗黙的な取得と解放を含め、トランザクション リソース マネージャの役割をアプリケーション サーバが果たします。

WebLogic Server では、XA リソースの静的な取得と動的な取得がサポートされています。

静的な取得と解放

XA リソースを静的に取得して登録する場合、WebLogic Server がアプリケーション サーバの役割を果たし、XA リソース プロバイダのために暗黙的な取得と解放を実行します。

WebLogic Server は、トランザクションの開始時と再開時にリソースを取得します。トランザクションが暗黙的に再開されるのは、それ以前に関連付けられたトランザクションを持つ Bean 管理のトランザクション Bean を呼び出すメソッドが開始されたとき、および別のサーバの呼び出しが返されたときです。

WebLogic Server は同様に、トランザクションの中断時、コミット時、およびロールバック時にリソースを解放します。トランザクションが暗黙的に中断されるのは、別のサーバを呼び出すとき、およびメソッド呼び出しがクライアントに返されたときです。使用される解放フラグは、リソース プロバイダでサポートされている場合には getDelistFlag() メソッドで、getDelistFlag() メソッドがサポートされていない場合には TMSUSPEND から取得します。getDelistFlag() メソッドの詳細については、 オプションの weblogic.transaction.XAResource インタフェース を参照してください。

動的な取得と解放

XA リソース プロバイダ自体を動的に取得して登録することによって、取得および解放を実行することもできます。この場合、取得と解放の実行において、XA リソース プロバイダが部分的に JTA アプリケーション サーバの役割を果たします。動的な取得の利点は、リソース プロバイダが必要に応じてゆるやかな取得を実行することで、不必要なリソースの取得を避けることができる点です。

XA リソースを動的に取得する場合は、XA リソース プロバイダで以下が実行されます。

import javax.transaction.Transaction;
// JNDI または TxHelper を介して現在のトランザクションを取得する
Transaction tx = TxHelper.getTransaction();
tx.enlistResource(res);

リソースの取得と解放には、かなりの負荷がかかるおそれがあります。WebLogic Server のトランザクション マネージャでは、最適化のため同じスレッド内の同じリソースが重複して取得されないようになっています。

XA リソースを動的に解放する場合は、XA リソース プロバイダが上記のようにトランザクションを取得し、解放フラグを提供すると同時に delistResource メソッドを呼び出します。

tx.delistResource(res, flag);

リソースを動的に取得して登録する場合、取得の手順は省略できません。解放の手順は省略可能です。

WebLogic Server のトランザクション マネージャは遅延解放を実行します。遅延解放の場合は、トランザクションの中断時と終了時に XA リソースに対して end() メソッドが呼び出されます。トランザクション マネージャは、次の順番で解放フラグを取得します。

 


オプションの weblogic.transaction.XAResource インタフェース

静的な解放の場合、または動的な解放を省略した場合、WebLogic Server JTA トランザクション マネージャは、これまで通りメソッド呼び出しの間に TMSUSPEND を使用して XA リソースを解放し、オープンしている可能性のあるカーソルを保持します。しかし、リソースによっては、TMSUCCESS で解放するよりも多くの内部リソースを必要とするおそれがあります。XA リソース プロバイダは、オプションの weblogic.transaction.XAResource インタフェースをサポートしており、 WebLogic Server で使用するデフォルトの解放フラグをオーバーライドできます。

weblogic.transaction.XAResource インタフェースでは、次のメソッドがサポートされています。

package weblogic.transaction;

public interface XAResource extends javax.transaction.xa.XAResource {
int getDelistFlag();
}

このメソッドがリソース プロバイダでサポートされている場合、WebLogic Server のトランザクション マネージャは getDelistFlag() メソッドを呼び出して、トランザクションの中断時とメソッドの終了時にリソースの解放に使用する解放フラグを取得します。

 

back to top previous page next page