BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > WebLogic jDriver for Oracle のコンフィグレーションと使い方 > 分散トランザクションでの WebLogic jDriver for Oracle/XA の使い方 |
WebLogic jDriver for Oracle のコンフィグレーションと使い方
|
分散トランザクションでの 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 for Oracle は内部的に Oracle C/XA スイッチを使用するため、xa_open と xa_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 リソースをコンフィグレーションします。
XA 対応 JDBC ドライバを分散トランザクションに参加させるには、以下のように JDBC 接続プールをコンフィグレーションします。
手順や属性の定義については、JDBC 接続プールのパネルでAdministration Console オンライン ヘルプを参照してください。
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 は、アプリケーションがインポートするパッケージを示します。特に以下の点に注意してください。
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
リスト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 内のビジネス メソッドとして実装された分散トランザクションを示します。
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();
}
...
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |