5.4. XA 登録の問題解決

XA リソースを登録する JTA の標準的な手順は、現在のトランザクションを表す現在の javax.transaction.Transaction オブジェクトに XA リソースを明示的に追加することです。つまり、新しいトランザクションが開始されるたびに XA リソースを明示的に登録する必要があります。

5.4.1. XA リソースの登録方法

XA リソースをトランザクションに登録するには、Transaction インターフェイスで enlistResource() メソッドを呼び出す必要があります。たとえば、TransactionManager オブジェクトおよび XAResource オブジェクトの場合は、以下のように XAResource オブジェクトを登録できます。

// Java
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
...
// Given:
// 'tm' of type TransactionManager
// 'xaResource' of type XAResource

// Start the transaction
tm.begin();

Transaction transaction = tm.getTransaction();
transaction.enlistResource(xaResource);

// Do some work...
...

// End the transaction
tm.commit();

リソース登録が難しい点として、リソースを新しいトランザクション ごと に登録する必要があるので、リソースの使用を開始する前にリソースを登録する必要があります。リソースを明示的に登録すると、エラーが発生しやすいコードに enlistResource() 呼び出しがいくつもある状態になる可能性があります。さらに、適切な場所で enlistResource() を呼び出すことが困難なことがあります。たとえば、トランザクションの詳細の一部を非表示にするフレームワークを使用している場合などです。

5.4.2. 自動登録

XA リソースを明示的に登録する代わりに、XA リソースの自動登録をサポートする機能を使用するほうが簡単かつ安全です。たとえば、JMS および JDBC リソースを使用する場合に、標準の手法として自動登録に対応するラッパークラスを使用することが挙げられます。

JDBC および JMS アクセスの両方で一般的なパターンは次のとおりです。

  1. アプリケーションコードは、JDBC アクセスには javax.sql.DataSource を、JMS での JDBC または JMS 接続には javax.jms.ConnectionFactory が必要です。
  2. アプリケーション/OSGi サーバー内では、これらのインターフェイスのデータベースまたはブローカー固有の実装が登録されます。
  3. アプリケーション/OSGi サーバーは、データベース/ブローカー固有のファクトリーを汎用のプーリングおよび登録ファクトリーに ラップ します。

このようにして、アプリケーションコードは引き続き javax.sql.DataSource および javax.jms.ConnectionFactory を使用しますが、内部的にこれらのコードがアクセスされると、通常は以下に関する追加機能があります。

  • 接続プール: データベース/メッセージブローカーへの新しいコネクションを作成する代わりに、事前に初期化された接続の プール が使用されます。プーリング には、接続の定期的な検証など、もう 1 つの側面があります。
  • JTA 登録 - java.sql.Connection (JDBC) または javax.jms.Connection (JMS) のインスタンスを返す前に、真の XA リソースであれば、実際の接続オブジェクトが登録されます。利用可能な場合、登録は JTA トランザクション内で行われます。

自動登録では、アプリケーションコードを変更する必要はありません。

JDBC データソースおよび JMS 接続ファクトリーのラッパーのプールとエンリストに関する詳細は、6章JDBC データソースの使用 および 7章JMS 接続ファクトリーの作成 を参照してください。