ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     jDriver for Oracle   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

分散トランザクションでの WebLogic jDriver for Oracle/XA の使い方

 

以下の節では、WebLogic jDriver for Oracle/XA を使用し、BEA WebLogic Server 環境で動作する EJB および RMI アプリケーションにトランザクションを統合する方法について説明します。

 


WebLogic jDriver for Oracle の XA モードと 非 XA モードの違い

WebLogic jDriver for Oracle は、分散トランザクションについて JDBC 2.0 オプション パッケージ API を完全サポートしています。分散トランザクション(XA)モードでこのドライバを使用するアプリケーションは、以下の例外を除いて、ローカル トランザクション(非 XA)モードの場合と同じように JDBC 2.0 コア API を使用できます。

最後の 2 つの理由が違うのは、WebLogic jDriver for Oracle/XA が分散トランザクションを構成する場合、分散トランザクションの境界を決めたり、調整したりするのが外部のトランザクション マネージャだからです。

詳細については、「JDBC 2.0 Standard Extension API spec」(バージョン 1.0、98/12/7 付、Section 7.1 の最後の 2 パラグラフ)を参照してください。

 


JDBC XA および 非 XA リソースのコンフィグレーション

Administration Console を使用して、以下の節で説明するように JDBC リソースをコンフィグレーションします。

JDBC/XA リソース

XA 対応 JDBC ドライバを分散トランザクションに参加させるには、以下のように JDBC 接続プールをコンフィグレーションします。

手順や属性の定義については、JDBC 接続プールのパネルで Administration Console オンライン ヘルプを参照してください。

XA 非対応の JDBC リソース

XA 非対応の JDBC リソースをサポートするには、JDBC トランザクション データ ソースをコンフィグレーションするときに、enableTwoPhaseCommit データベース プロパティを選択します。このプロパティの詳細については、『管理者ガイド』の「分散トランザクション用の XA 非対応 JDBC ドライバのコンフィグレーション」を参照してください。

 


WebLogic jDriver for Oracle XA の制限

XA モードの WebLogic jDriver for Oracle は以下の動作をサポートしていません。

 


分散トランザクションの実装

ここでは以下について説明します。

パッケージをインポートする

コード リスト 4-1 は、アプリケーションがインポートするパッケージを示します。特に以下の点に注意してください。

JNDI を介したデータ ソースの検索

コード リスト 4-2 は、JNDI を介したデータ ソースの検索方法を示します。

コード リスト 4-2 JNDI を介したデータ ソースの検索

static DataSource pool;

...

public void get_connpool(String pool_name)
throws Exception
{
try {
javax.naming.Context ctx = new InitialContext();
pool = (DataSource)ctx.lookup("jdbc/" + pool_name);
}
catch (javax.naming.NamingException ex){
TP.userlog("Couldn't obtain JDBC connection pool: " + pool_name);
throw ex;
}
}
}

分散トランザクションの実行

コード リスト 4-3 は、2 つのデータベース接続を使用し、セッション Bean 内のビジネス メソッドとして実装された分散トランザクションを示します。

コード リスト 4-3 分散トランザクションの実行

public class myEJB implements SessionBean {
  EJBContext ejbContext;

  public void myMethod(...) {
  javax,transaction.UserTransaction usertx;
  javax.sql.DataSource data1;
  javax.sql.DataSource data2;
  java.sql.Connection conn1;
  java.sql.Connection conn2;
  java.sql.Statement stat1;
  java.sql.Statement stat2;

  InitialContext initCtx = new InitialContext();

  //
  // ユーザ トランザクション オブジェクトを初期化する
  //
  usertx = ejbContext.getUserTransaction();

  // 新規のユーザ トランザクションを開始する
  usertx.begin();

  // 最初のデータベースとの接続を確立し、
  // and prepare it for handling a transaction.
  data1 = (javax.sql.DataSource)
  initCtx.lookup("java:comp/env/jdbc/DataBase1");
  conn1 = data1.getConnection();

  stat1 = conn1.getStatement();

  // 2 番目のデータベースとの接続を確立し、
  // トランザクションの処理を準備する
  data2 = (javax.sql.DataSource)
  initCtx.lookup("java:comp/env/jdbc/DataBase2");
  conn2 = data1.getConnection();

  stat2 = conn2.getStatement();

  // Update both conn1 and conn2. The EJB Container
  // 関連するリソースを自動的にリスト表示する
  stat1.executeQuery(...);
  stat1.executeUpdate(...);
  stat2.executeQuery(...);
  stat2.executeUpdate(...);
  stat1.executeUpdate(...);
  stat2.executeUpdate(...);

  // トランザクションをコミットする
  // 関連するデータベースに変更を適用する
  usertx.commit();

  // すべての接続と文を解放する
  stat1.close();
  stat2.close();
  conn1.close();
  conn2.close();
  }
...
}

 

back to top previous page next page