JTA APIの使用

TimesTenのJTA実装は、JTA仕様の規定に準拠したAPIを提供します。

この項では、JTA APIの使用に関する次の内容について説明します。

WebLogicへのTimesTen DSNの登録

WebLogicでTimesTen DSNを登録する方法、TimesTenのアプリケーション・サーバーの構成およびオブジェクトリレーショナル・マッピングのフレームワークに関する情報については、TimesTen Classicクイック・スタートを参照してください。

「TimesTenクイック・スタートおよびサンプル・アプリケーションについて」を参照してください。

必要なパッケージのインポート

TimesTen JDBCおよびXA実装は、パッケージで入手可能です。

import com.timesten.jdbc.*;
import com.timesten.jdbc.xa.*;

アプリケーションは、次の標準パッケージもインポートする必要があります。

import java.sql.*;
import javax.sql.*;
import javax.transaction.xa.*;

TimesTenのXAConnectionオブジェクトの作成

XAデータ・ソースへの接続は、XADataSourceオブジェクトを経由して確立されます。TimesTenXADataSourceインスタンスを接続ファクトリとして使用して、データベースにXAConnectionオブジェクトを作成できます。TimesTenXADataSourcejavax.sql.XADataSourceインタフェースを実装します。

TimesTenXADataSourceインスタンスを新規に作成したら、setUrl()メソッドを使用して、データベースを指定します。

URLは次のようになります。

  • 直接接続の場合: jdbc:timesten:direct:DSNname

  • クライアント接続の場合: jdbc:timesten:client:DSNname

setUser()メソッドおよびsetPassword()メソッドを任意で使用して、特定のユーザーのIDおよびパスワードを設定することもできます。

次の例では、TimesTenXADataSourceオブジェクトをファクトリとして使用して、TimesTen XAデータ・ソース・オブジェクトを作成します。次に、このTimesTenXADataSourceインスタンスに、TimesTen DSN (dsn1)、ユーザー名(myName)およびパスワード(password)を識別するURLが設定されます。次に、getXAConnection()メソッドが、xaConnオブジェクトへ接続を返すために使用されます。

TimesTenXADataSource xads = new TimesTenXADataSource();
 
xads.setUrl("jdbc:timesten:direct:dsn1");
xads.setUser("myName");
xads.setPassword("password");
 
XAConnection xaConn = null;
try {
    xaConn = xads.getXAConnection();
}
catch (SQLException e){
    e.printStackTrace();
    return;
}

XAデータ・ソース・オブジェクトに対して複数の接続を作成できます。この例では、xaConn2という2つ目の接続を作成します。

XAConnection xaConn  = null;
XAConnection xaConn2 = null;

try {
    xaConn  = xads.getXAConnection();
    xaConn2 = xads.getXAConnection();
}

次の例では、dsn1およびdsn2という名前のデータベース用にTimesTenXADataSourceのインスタンスを2つ作成します。次に、dsn1に1つの接続を作成し、dsn2に2つの接続を作成します。

TimesTenXADataSource xads = new TimesTenXADataSource();
 
xads.setUrl("jdbc:timesten:direct:dsn1");
xads.setUser("myName");
xads.setPassword("password");
 
XAConnection xaConn1 = null;
XAConnection xaConn2 = null;
XAConnection xaConn3 = null;
 
try {
   xaConn1 = xads.getXAConnection(); // connect to dsn1
}
catch (SQLException e){
   e.printStackTrace();
   return;
}
 
xads.setUrl("jdbc:timesten:direct:dsn2");
xads.setUser("myName");
xads.setPassword("password");
 
try {
   xaConn2 = xads.getXAConnection(); // connect to dsn2
   xaConn3 = xads.getXAConnection(); // connect to dsn2
}
catch (SQLException e){
   e.printStackTrace();
   return;
}

ノート:

XAConnectionが確立されると、自動コミットはオフになります。

XAResourceおよびConnectionオブジェクトの作成

getXAConnection()を使用して、XAConnectionオブジェクトを取得した後、XAConnectionメソッドgetXAResource()を使用して、XAResourceオブジェクトを取得して、次にXAConnectionメソッドgetConnection()を使用して、基礎となる接続のConnectionオブジェクトを取得できます。

//get an XAResource
XAResource xaRes = null;
try {
   xaRes = xaConn.getXAResource();
}
catch (SQLException e){
   e.printStackTrace();
   return;
}
 
//get an underlying physical Connection
Connection conn = null;
try {
   conn = xaConn.getConnection();
}
catch (SQLException e){
   e.printStackTrace();
   return;
}

この時点で、同一の接続のconnを、ローカル・トランザクションおよびグローバル・トランザクションの両方に使用できます。ただし、次の点に注意してください。

  • グローバル・トランザクションを開始する前に、アクティブなローカル・トランザクションをコミットまたはロールバックする必要があります。そうしないと、XAException例外XAER_OUTSIDEが発生します。

  • ローカル・トランザクションを開始する前に、アクティブなグローバル・トランザクションを終了する必要があります。そうしないと、SQLException、「Illegal combination of local transaction and global (XA) transaction.」が表示されます。