WebLogic JTA プログラマーズ ガイド
WebLogic Server でのサードパーティ JDBC XA ドライバの使い方
この章では次の内容について説明します。
サードパーティ XA ドライバの概要
この節では、分散トランザクションにおける WebLogic Server でのサードパーティ JDBC 2 層ドライバの使い方について説明します。これらのドライバは、WebLogic Server 接続プールと DBMS の間の接続を提供します。分散トランザクションで使用するドライバは、後に「/XA」が続くドライバ名 (Oracle Thin/XA Driver など) によって指定されます。
サードパーティ XA ドライバの表
次の表に、サード パーティ JDBC/XA ドライバを WebLogic Server で使用する場合の確認済みの機能について示します。
サードパーティ ドライバのコンフィグレーションとパフォーマンス要件
次に、WebLogic Server で特定のサードパーティ XA ドライバを使用するための要件とガイドラインを示します。
Oracle Thin/XA Driver の使い方
WebLogic Server にバンドルされた Oracle Thin Driver 10g (10.1.0.2.0) は事前にコンフィグレーションされ、そのまま使用できる状態になっています。ドライバを更新する場合や異なるバージョンを使用する場合は、『WebLogic JDBC プログラマーズ ガイド』の「Oracle Thin Driver の使い方」を参照してください。
WebLogic Server で Oracle Thin/XA Driver を使用するための情報を以下の節で示します。
Oracle Thin/XA Driver のソフトウェア要件
Oracle Thin/XA Driver のソフトウェア要件は次のとおりです。
Oracle Thin Driver に関する確認済みの問題
表 7-2 に、Oracle Thin Driver の確認済みの問題と BEA の回避策を示します。これらの問題に関する最新の情報については、Oracle の Web サイトを参照してください。
表 7-2 Oracle Thin Driver の確認済みの問題と回避策
説明
|
Oracle のバグ
|
説明/WebLogic Server の回避策
|
WebLogic Server の再起動後、Oracle Thin Driver の 9.2.0.3 以前のバージョンを使用すると、XAER_PROTO エラーまたは断続的なハングが発生する場合がある。
|
2717235
|
この状況は、サーバの再起動時に、WebLogic Server が XA.recover() を呼び出して保留中のトランザクションを回復するために発生する。Oracle Thin Driver の 9.2.0.3 以前のバージョンでは、Oracle DBMS はローカル トランザクションを開いてトランザクションの回復作業を完了するものの、そのローカル トランザクションを閉じない。トランザクションの回復に使用された接続が接続プールに戻され、アプリケーションによって再利用されても、ローカル トランザクションは依然として存在する。この接続の最初の操作で、XAER_PROTO エラーが送出される (TestConnsOnReserve が true に設定されている場合、接続テストは接続の最初の操作である)。WebLogic Server は、リソース接続の登録を解除し、リソースに対するトランザクションがすべて完了するまで一定時間待機する。これがハング状態に見える。
Oracle では、このバグに対するパッチを提供している。このパッチは、Oracle Metalink Web サイトからダウンロードできる。Oracle バグ番号 2717235 を参照。
この問題は、バージョン 9.2.0.4 および 10g では修正されている。
|
Oracle Thin Driver バージョン 9.2.0.1 および 9.2.0.2 では、Long raw も含むテーブルの BLOB を処理できない。テーブルから BLOB を取り出し、blob.length() を呼び出すと、SQL プロトコル違反になる。
|
2696397
|
この問題は、バージョン 9.2.0.3 および 10g では修正されている。
|
Oracle Thin Driver 9.2.0.1 および 9.2.0.2 の使用中に、データ変換を伴う setNull とともに addBatch を実行すると、ヌル ポインタ例外になる。たとえば、次の場合、Oracle Thin Driver 9.2.0 では例外になる。
1. pstmt.setNull(1, java.sql.Types.REAL)
2. pstmt.addBatch()
3. pstmt.setNull(1, java.sql.Types.VARCHAR)
|
|
この問題は、バージョン 9.2.0.3 および 10g では修正されている。
|
Oracle Thin Driver バージョン 9.2.0.1 および 9.2.0.2 では、Long も含むテーブルの CLOB を処理できない。テーブルから CLOB を取り出し、clob.length() を呼び出すと、SQL プロトコル違反になる。
|
|
回避策 : このシナリオでは、clob.length() を呼び出す前に LONG カラムを読み込むことができる。
この問題は、バージョン 9.2.0.3 および 10g では修正されている。
|
Oracle Thin Driver バージョン 9.2.0.1 および 9.2.0.2.0 では、「alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' 」を使用してデフォルトの Oracle タイムスタンプ形式を変更できない。以前のバージョンでは変更可能。
|
2632931
|
TAR 番号 2677656.995
9.2.0.2.1 で修正されている。
Oracle では、このバグに対するパッチを提供している。このパッチは、Oracle Metalink Web サイトからダウンロードできる。Oracle バグ番号 2632931 を参照。
|
ORA-01453 -「SET TRANSACTION をトランザクションの最初の文にする必要があります」
|
|
Oracle Thin/XA Driver を使用する場合には、トランザクションのトランザクション アイソレーション レベルを変更できない。トランザクションは、データベースに対して設定されているデフォルトのトランザクション アイソレーションを使用する。
|
ORA-01002 -「フェッチ順序が無効です」例外。XAResource.end(TMSUSPEND) 結果および XAResource.start(TMRESUME) 結果の後で結果セットを反復すると ORA-01002 になる。
この例外は、Oracle Thin Driver を使用している WebLogic Server のプールされた接続を使用して、外部クライアントが結果セットを取得する場合にも発生する。結果セットがクライアントに送信されると、現在のトランザクションがサスペンドする。
|
—
|
回避策として、文のフェッチ サイズを結果セットのサイズ以上に設定する。つまり、この回避策を使用しない限り、Oracle Thin Driver をクライアント サイドでは使用できない。または、メソッド呼び出しの間、Bean では結果セットを開いておくことができない。
これは、修正される予定のない Oracle の制限である。
|
グローバル トランザクションのない更新がサポートされない。更新時にグローバル トランザクションがない場合、更新を実行するためにローカル トランザクションが暗黙的に開始され、グローバル トランザクションと同じ XA 接続が再利用されるために XAER_RMERR になる。
さらに、アプリケーションがローカル トランザクションのコミットを試みる (自動コミットを true に設定する、または Connection.commit() を明示的に呼び出す) と、Oracle XA Driver が「SQLException: Use explicit XA call」を返す。
|
—
|
アプリケーションで XA ドライバを使用して更新を行う場合は、有効なグローバル トランザクション コンテキストが存在していなければならない。つまり、Bean メソッドには、トランザクション属性として Required、RequiresNew、または Mandatory を持たせる必要がある。
|
Oracle Thin/XA Driver の環境の設定
WebLogic Server のコンフィグレーション
『WebLogic JDBC プログラマーズ ガイド』の「Oracle Thin Driver の使い方」を参照してください。
XA のデータベース サーバでの有効化
XA 用のデータベースを準備するには、以下の操作を実行します。
システム ユーザとして sqlplus にログオンします (sqlplus sys/CHANGE_ON_INSTALL@<DATABASE ALIAS NAME>
など)。
grant select on v$xatrans$ to public (or <user>);
grant select on pending_trans$ to public;
grant select on dba_2pc_pending to public;
grant select on dba_pending_transactions to public;
(Oracle Thin driver 10.1.0.3 以降をお使いの場合)
grant execute on dbms_system to <user>;
上の手順をデータベース サーバ上で実行しない場合、通常の XA データベース クエリと更新は正常に動作できます。ただし、クラッシュ後の再起動に続き、WebLogic Server トランザクション マネージャが回復を行うときに、Oracle リソースの回復は XAER_RMERR
になり失敗します。クラッシュの回復は、XA リソースに対する標準的な処理です。
Oracle Thin/XA Driver のコンフィグレーション プロパティ
次の表に、接続プールのコンフィグレーションのためのサンプル コードを示します。
Oracle Thin/XA Driver : 接続プール コンフィグレーション
プロパティ名
|
プロパティ値
|
Name
|
jtaXAPool
|
Targets
|
myserver,server1
|
URL
|
jdbc:oracle:thin:@ serverName: port (Windows では通常 1521) : sid
|
DriverClassname
|
oracle.jdbc.xa.client.OracleXADataSource
|
Initial Capacity
|
1
|
MaxCapacity
|
20
|
CapacityIncrement
|
2
|
Properties
|
user=scott;password=tiger
|
次の表に、TxDataSource のコンフィグレーションのためのサンプル属性を示します。Administration Console で TxDataSource を作成する場合は、データ ソースの作成時に [グローバル トランザクションを受け付ける] を選択してください。
表 7-3 Oracle Thin/XA Driver : TxDataSource のコンフィグレーション
プロパティ名
|
プロパティ値
|
Name
|
jtaXADS
|
Targets
|
myserver,server1
|
JNDIName
|
jtaXADS
|
PoolName
|
jtaXAPool
|
IBM DB2 Type 2 XA JDBC Driver の使い方
以下の節では、WebLogic Server で Type2 DB2 7.2/XA Driver を使用するために環境を設定する方法について説明します。
インストール手順と接続プールのコンフィグレーション手順については、『WebLogic JDBC プログラマーズ ガイド』の「IBM DB2 Type 2 JDBC Driver のインストールと使い方」(../jdbc/thirdparty.html#db2
) を参照してください。
DB2 7.2/XA Driver の環境の設定
次のように環境を設定します。
<db2>/java12
ディレクトリにあるバッチファイル usejdbc2.bat
を実行して、正しいバージョンの db2java.zip
ファイルを展開し、適切な場所に移動します。これで、ドライバの JDBC 2.0 機能が有効になります。このバッチ ファイルを実行する前に、実行中の DB2 プロセスがないことを確認してください。
CLASSPATH
環境変数に <db2>/java/db2java.zip
を含めます。
PATH
環境変数に <db2>/bin
を含めます。
ここで、<db2>
は DB2 サーバがインストールされているディレクトリを表します。
XAResource として DB2 を使用する場合の制限
複数の接続プールを持つコンフィグレーションの場合、各接続プールは個別のデータベース インスタンスを持つ必要があります。
トランザクションは、サスペンドされたトランザクションにすでに関連付けられているリソースでは開始できません。この場合、javax.transaction.InvalidTransactionException
(非アクティブなトランザクションを再開しようとした) が送出されます。サスペンドと再開の間に、中間トランザクションが、サスペンドされたトランザクションで使用されたものと同じリソースを使用すると、javax.transaction.invalidtransation
例外が送出されます。
異なるリソースが中間トランザクションの内部で使用される場合は、正常に動作します。
Sybase jConnect 5.5/XA Driver の使い方
Sybase jConnect 5.5/XA Driver を使用する場合の重要なコンフィグレーション情報とパフォーマンス問題を以下の節で示します。
Sybase jConnect 5.5/XA の確認済みの問題
次に、確認済みの問題と BEA の回避策を示します。
表 7-4 Sybase jConnect 5.5 の確認済みの問題と回避策
説明
|
Sybase のバグ
|
説明/WebLogic Server の回避策
|
setAutoCommit (true) を呼び出すと次の例外が送出される。
java.sql.SQLException: JZ0S3: The inherited method setAutoCommit(true) cannot be used in this subclass.
|
10726192
|
回避策はなし。ベンダによる修正が必要。
|
分散トランザクションでドライバを使用する場合、XAResource.end(TMSUSPEND) に続けて XAResource.end(TMSUCCESS) を呼び出すと、XAER_RMERR になる。
|
10727617
|
WebLogic Server では、このバグに対する内部的な回避策を提供している。
接続プールのプロパティを XAEndOnlyOnce="true" に設定する。
ベンダによる修正が要求されている。
|
デタッチされた Sybase トランザクションの結果として OutOfMemoryError が検出される。
|
|
最新の Sybase jConnect Driver にアップグレードする。
|
XA をサポートするための Sybase サーバの設定
データベース サーバで環境を設定するには、以下の説明に従います。
分散トランザクション管理のライセンスをインストールします。
sp_configure
"enable DTM",1
を実行して、トランザクションを有効にします。
sp_configure "enable xat coordination",1
を実行します。
<USER_NAME>
にロール dtm_tm_role
を付与します。
SYBASE_INSTALL\OCS-12_0\sample\xa-dtm
サブディレクトリにあるサンプルの xa_config
ファイルを、3 レベル上位の SYBASE_INSTALL
へコピーします。SYBASE_INSTALL
は、Sybase サーバをインストールしたディレクトリです。次に例を示します。
$ SYBASE_INSTALL\xa_config
xa_config
ファイルを編集します。最初の [xa
] セクションで、サンプル サーバ名を適切なサーバ名に変更します。
トランザクションを実行するときのデッドロックを防ぐために、デフォルトで低レベル ロックを有効にします。
sp_configure "lock scheme",0,
datarows を実行します。
注意 : jConnect.jar
および jconn2.jar
ファイルは、2 つとも WL_HOME
\server\lib
フォルダに含まれ、マニフェスト ファイル weblogic.jar
で参照されます。WebLogic Server を起動する時に、ドライバが自動的にロードされ、WebLogic Server で使用する準備が整います。これのドライバを WebLogic ユーティリティまたは他のアプリケーションで使用するには、これらのファイルのパスを CLASSPATH
で指定します。
XA と Sybase Adaptive Server に関する注意
XA 接続が適切にサポートされているのは、Sybase Adaptive Server Enterprise 12.0 以降のバージョンのみになります。WebLogic Server との XA 接続は Sybase Adaptive Server 11.5 および 11.9 ではサポートされていません。
Sybase Adaptive Server における実行スレッドとトランザクション
Adaptive Server 12.0 より前のバージョンでは、トランザクションのすべてのリソースが、サーバ上の単一のタスクによって非公開で所有されていました。サーバは、トランザクションを開始したタスク以外のタスクとはトランザクションを共有できませんでした。Adaptive Server バージョン 12.x には、XA 準拠のトランザクション マネージャ (WebLogic Server など) によって使用されるサスペンドおよび結合のセマンティクスに対するサポートが含まれています。トランザクションは異なる実行スレッド間で共有できます。つまり、1 つの実行スレッドに関連付けることはできません (デタッチ状態)。
デタッチされたトランザクションに対するタイムアウトの設定
Sybase サーバでは、dtm detach timeout period
を設定することで、分散トランザクション ブランチがデタッチ状態 (関連付けられた実行スレッドがない状態) のままでいる時間 (分単位) を設定できます。この時間が経過すると、DBMS は自動的にトランザクションをロールバックします。dtm detach timeout period
は、データベース サーバ上のすべてのトランザクションに適用されます。個々のトランザクションに対しては設定できません。
たとえば、10 分のデタッチ状態が経過した後、自動的にトランザクションをロールバックするには、次のコマンドを使用します。
sp_configure 'dtm detach timeout period', 10
WebLogic Server でトランザクションがタイムアウトする前にデータベース サーバによってトランザクションがロールバックされないように、dtm detach timeout period
はトランザクションのタイムアウトより大きい値に設定する必要があります。トランザクションのタイムアウトの設定については、Administration Console オンライン ヘルプの「JTA」を参照してください。
dtm detach timeout period
の詳細については、Sybase のドキュメントを参照してください。
Sybase Adaptive Server でのトランザクションの動作
Sybase サーバでグローバル トランザクションが開始されているが、完了していない場合、そのトランザクションの結果は、破棄される前のトランザクションの状態によって異なります。
xa.end
呼び出しの前にクライアントが終了した場合、トランザクションはロールバックされます。
xa.end
呼び出しの後にクライアントが終了した場合、トランザクションはデータベース サーバ上に残り (すべての関連するロックを保持し) ます。
アプリケーションが xa.start
を呼び出したものの、xa.end
をまだ呼び出していないときに不意に終了した場合は、データベース サーバが即座にトランザクションをロールバックし、トランザクションによって保持されていたロックを解放します。
アプリケーションが xa.start
および xa.end
を呼び出し、不意に終了した場合は、データベース サーバは、dtm detach timeout period
で指定した時間が経過した後でトランザクションをロールバックし、トランザクションによって保持されていたロックを解放します。「デタッチされたトランザクションに対するタイムアウトの設定」を参照してください。
アプリケーションが xa.start
および xa.end
を呼び出し、トランザクションの準備が完了していたときに、アプリケーションが不意に終了した場合は、正常に回復できるようにトランザクションは存続します。トランザクション マネージャは rollback または commit を呼び出し、トランザクションを完了する必要があります。
Sybase jConnect 5.5/XA Driver の接続プール
次の表に、接続プールのコンフィグレーションのためのサンプル コードを示します。
表 7-5 Sybase jConnect 5.5/XA Driver : サンプル接続プール コンフィグレーション
プロパティ名
|
プロパティ値
|
Name
|
jtaXAPool
|
Targets
|
myserver,server1
|
DriverClassname
|
com.sybase.jdbc2.jdbc.SybXADataSource
|
Properties
|
User=dbuser;
DatabaseName=dbname;
ServerName=server_name_or_IP_address;
PortNumber=serverPortNumber;
NetworkProtocol=Tds;
resourceManagerName=Lrm_name_in_xa_config;
resourceManagerType=2
|
Initial Capacity
|
1
|
MaxCapacity
|
10
|
CapacityIncrement
|
1
|
Supports Local Transaction
|
True
|
ここで、Lrm_name は Logical Resource Manager 名を参照します。
次の表に、TxDataSource のコンフィグレーションのためのサンプル コードを示します。
表 7-6 Sybase jConnect 5.5/XA Driver : TxDataSource のコンフィグレーション
プロパティ名
|
プロパティ値
|
Name
|
jtaXADS
|
Targets
|
server1
|
JNDIName
|
jtaXADS
|
PoolName
|
jtaXAPool
|
Java クライアントのコンフィグレーション プロパティ
Java クライアントを実行する場合の以下のコンフィグレーション プロパティを設定します。
表 7-7 Sybase jConnect 5.5/XA Driver : Java クライアント接続プロパティ
プロパティ名
|
プロパティ値
|
ds.setPassword
|
< password >
|
ds.setUser
|
< username >
|
ds.setNetworkProtocol
|
Tds
|
ds.setDatabaseName
|
< database-name >
|
ds.setResourceManagerName
|
< Lrm name in xa_config file >
|
ds.setResourceManagerType
|
2
|
ds.setServerName
|
< machine host name >
|
ds.setPortNumber
|
port (通常は 4100)
|
その他のサードパーティ XA ドライバ
その他のサードパーティ製 XA 準拠 JDBC ドライバを使用するためには、ドライバ クラス ライブラリのパスを CLASSPATH
で指定し、ベンダの説明に従う必要があります。