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オブジェクトを作成できます。TimesTenXADataSourceはjavax.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.」が表示されます。