WebLogic jDriver for Oracle のコンフィグレーションと使い方 (非推奨)
注意 : WebLogic jDriver for Oracle は非推奨となりました。将来のリリースでは削除されます。BEA では、BEA WebLogic Type 4 JDBC Oracle ドライバの使用をお勧めします。詳細については、『WebLogic Type 4 JDBC ドライバ ガイド』を参照してください。
以下の節では、WebLogic jDriver for Oracle/XA を使用し、BEA WebLogic Server 環境で動作する EJB および RMI アプリケーションにトランザクションを統合する方法について説明します。
WebLogic jDriver for Oracle は、分散トランザクションについて JDBC 2.0 オプション パッケージ API を完全サポートしています。分散トランザクション (XA) モードでこのドライバを使用するアプリケーションは、以下の例外を除いて、ローカル トランザクション (非 XA) モードの場合と同じように JDBC 2.0 コア API を使用できます。
java.sql.Connection.setAutoCommit
メソッドを呼び出して自動コミット モードを有効化しようとすると、SQLException が発生します。java.sql.Connection.commit
または java.sql.Connection.rollback
メソッドを呼び出して分散トランザクションを終了しようとすると、SQLException が発生します。 最後の 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 ドライバを使用する接続プールには適用されません。
Administration Console を使用して、以下の節で説明するように JDBC リソースをコンフィグレーションします。
XA 対応 JDBC ドライバを分散トランザクションに参加させるには、以下のように JDBC 接続プールをコンフィグレーションします。
DriverName
プロパティに、javax.sql.XADataSource
インタフェースをサポートしているクラスの名前を指定します。つまり、weblogic.jdbc.oci.xa.XADataSource
を DriverName
プロパティ (Administration Console の Driver Classname
) として使用します。手順や属性の定義については、[JDBC 接続プール] タブに関する 「Administration Console オンライン ヘルプ」を参照してください。
表 4-1 に、WebLogic jDriver for Oracle でサポートされているデータ ソース プロパティを示します。「JDBC 2.0」カラムは、特定のデータ ソース プロパティが JDBC 2.0 の標準データ ソース プロパティか (S)、または JDBC に対する WebLogic Server の拡張か (E) を示します。
「省略可能」カラムは、特定のデータ ソース プロパティが省略可能かどうかを示します。「はい*」マークが付いたプロパティは、表 4-1 に示された、Oracle の xa_open
文字列 (openString
プロパティの値) の対応するフィールドにマップされます。それらのプロパティが指定されない場合、デフォルト値は openString
プロパティから取得されます。それらのプロパティが指定される場合、その値は openString
プロパティで指定された値と一致する必要があります。プロパティが一致しない場合、XA 接続を確立しようとすると SQLException
が送出されます。
「いいえ*」マークが付いた必須プロパティも、Oracle の xa_open
文字列の対応するフィールドにマップされます。これらのプロパティは、Oracle の xa_open
文字列を指定するときに指定します。プロパティが指定されない場合や、指定されていても一致しない場合は、XA 接続を確立しようとすると SQLException
が送出されます。
「**」マークが付いたプロパティ名はサポートされていますが、WebLogic Server では使用されません。
|
表 4-2 に、Oracle の xa_open
文字列フィールドとデータ ソース プロパティの間のマッピングを示します。
注意 : Oracle の xa_open
文字列で「Threads=true
」と指定する必要があります。
Oracle の xa_open
文字列フィールドの詳細については、Oracle のドキュメントを参照してください。
XA 非対応の JDBC リソースをサポートするには、JDBC Tx データ ソース ([グローバル トランザクションを受け付ける] を選択したデータ ソース) をコンフィグレーションするときに、enableTwoPhaseCommit
データベース プロパティ (Administration Console の [非ドライバ用に 2 フェーズ コミットをエミュレート]) を選択します。このプロパティの詳細については、Administration Console オンライン ヘルプの「分散トランザクション用非 XA JDBC ドライバのコンフィグレーション」を参照してください。
XA モードの WebLogic jDriver for Oracle は以下の動作をサポートしていません。
supportsLocalTransaction
を true
に設定できません。その接続プールからの接続でローカル トランザクションをコミットしようとすると、次のエラーが送出されます。
java.sql.SQLException:Does not support SQL execution with no global transaction
コード リスト 4-1 は、アプリケーションがインポートするパッケージを示します。特に以下の点に注意してください。
java.sql.*
および javax.sql.*
パッケージは、データベース操作を行うために必要です。javax.naming.*
パッケージは、サーバの起動時にコマンドライン パラメータとして渡されるプール名についての JNDI ルックアップを実行するために必要です。プール名は、そのサーバ グループで登録する必要があります。
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();
}
...
}