BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic jDriver for Oracle のコンフィグレーションと使い方

 Previous Next Contents 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 パラグラフ) を参照してください。

WebLogic XA jDriver での接続の動作

WebLogic XA jDriver for Oracle は内部的に Oracle C/XA スイッチを使用するため、xa_openxa_start は、SQL 呼び出しを行う各スレッド上で呼び出される必要があります。 また、xa_open を呼び出すと、新しい物理的な XA データベース接続が作成されます。 これらの制限に対処するために、WebLogic XA jDriver for Oracle では、スレッドが接続を使用するまでは物理的なデータベース接続を作成しません。 スレッドが接続を使用するときに、XA jDriver は xa_open (および xa_start) を呼び出して接続を作成し、その接続をスレッドに関連付けます。 データベース接続が作成された後も、接続はスレッドにそのまま関連付けられており、ドライバは xa_close を呼び出しません。 以降にスレッドでデータベース接続が必要になると、スレッドは関連付けられている同じデータベース接続を使用します。ただし、これは JDBC 接続プールから接続を取得して返しているように見えます。

このドライバの動作によって、JDBC 接続プールの動作も若干変わります。

注意: これらの動作の変更点は、物理的なデータベース接続の作成に WebLogic XA jDriver を使用する JDBC 接続プールにのみ適用されます。 他の XA ドライバを使用する接続プールには適用されません。

 


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

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

JDBC/XA リソース

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

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

XA 非対応の JDBC リソース

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

 


WebLogic jDriver for Oracle XA の制限

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

 


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

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

パッケージのインポート

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

コード リスト 4-1 必要なパッケージのインポート

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

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();

// 最初のデータベースとの接続を確立し、
// トランザクションの処理を準備する
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();

// conn1 および conn2 の両方を更新する。EJB コンテナは
// 関連するリソースを自動的にリスト表示する
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 Next