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.」が表示されます。