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 アクセスの両方で一般的なパターンは次のとおりです。
-
アプリケーションコードは、JDBC アクセスには
javax.sql.DataSource
を、JMS での JDBC または JMS 接続にはjavax.jms.ConnectionFactory
が必要です。 - アプリケーション/OSGi サーバー内では、これらのインターフェイスのデータベースまたはブローカー固有の実装が登録されます。
- アプリケーション/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 接続ファクトリーの作成 を参照してください。