- Transaction Manager for Microservices開発者ガイド
- XAでのアプリケーションの開発
- XAでのJAX-RSアプリケーションの開発
- トランザクション参加側としてのJAX-RSアプリケーションの構成
- 複数のXA準拠リソース・マネージャを使用するJAX-RSアプリケーションの構成
7.11.3.2 複数のXA準拠リソース・マネージャを使用するJAX-RSアプリケーションの構成
複数のXA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してJAX-RS参加側アプリケーションを構成します。
- MicroTx Javaライブラリ・ファイルをアプリケーションの
pom.xml
ファイルにmaven依存関係として含めます。次のサンプル・コードは24.4リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。-
Helidon 2.xなどのJakarta EE8環境では、
TmmLib
ファイルを使用します。<dependency> <groupId>com.oracle.tmm.jta</groupId> <artifactId>TmmLib</artifactId> <version>24.4</version> </dependency>
-
Helidon 3.xアプリケーションなどのJakarta EE9環境では、
TmmLib-jakarta
ファイルを使用します。<dependency> <groupId>com.oracle.tmm.jta</groupId> <artifactId>TmmLib-jakarta</artifactId> <version>24.4</version> </dependency>
-
- リソース・マネージャごとに
DataSourceInfo
オブジェクトを作成します。必ず、アプリケーションのYAMLファイルで指定したデータ・ソース名とリソース・マネージャIDを指定してください。サンプル・コマンド
DataSourceInfo departmentDataSourceInfo = new DataSourceInfo("ORCL1-8976-9776-9873"); departmentDataSourceInfo.setDataSourceName(departmentDataSource); DataSourceInfo creditDataSourceInfo = new DataSourceInfo("ORCL2-2134-5668-8672"); creditDataSourceInfo.setDataSourceName(creditDataSource);
説明
departmentDataSource
およびcreditDataSource
は、アプリケーションのYAMLファイルで指定したXAデータ・ソースの名前です。ORCL1-8976-9776-9873
およびORCL2-2134-5668-8672
は、アプリケーションのYAMLファイルでdepartmentDataSource
およびcreditDataSource
にそれぞれ指定したリソース・マネージャIDです。
後で、
@Inject
注釈を使用して、アプリケーションでこれらのデータ・ソースが使用されることを確認します。 - 作成した
DataSourceInfo
オブジェクトごとに、次のMicroTxクライアント・ライブラリ・プロパティの1つのみを入力します。次の例では、creditDataSource
オブジェクトのプロパティ値を指定します。同様に、他のリソース・マネージャのプロパティ値を指定できます。値を指定しない場合、リソースはデフォルトでXA準拠とみなされます。- XA準拠リソースの場合は、次を入力します:
creditDataSource.setXaSupport();
- Oracle RACデータベースの場合は、次のように入力します:
creditDataSource.setRAC(true);
- LLRの最適化を使用する非XAリソースの場合は、次を入力します:
creditDataSource.setLLRSupport();
- LRCの最適化を使用する非XAリソースの場合は、次を入力します:
creditDataSource.setLRCSupport();
- XA準拠リソースの場合は、次を入力します:
XADatasource
オブジェクトを初期化します。アプリケーションで複数のリソース・マネージャを使用している場合は、XA準拠リソース・マネージャごとに次の方法でXADatasource
オブジェクトを初期化します。MicroTxクライアント・ライブラリは、
XADatasource
オブジェクトにアクセスする必要があります。このオブジェクトを使用してXAConnection
オブジェクトおよびXAResource
オブジェクトを作成し、リソース・マネージャまたはデータベース・サーバーに接続します。次のコードでは、接続オブジェクトを作成する際にアプリケーション・コードの先頭にXADatasource
オブジェクトをどのように定義するかを示しています。class oracle.tmm.jta.TrmConfig static void initXaDataSource(XADataSource dataSource, DataSourceInfo creditDataSource)
ここで、
creditDataSource
は、以前に作成したDataSourceInfo
オブジェクトです。すべてのリソース・マネージャについてこのステップを繰り返します。
XADataSource
の詳細は、https://docs.oracle.com/javase/8/docs/api/javax/sql/XADataSource.htmlを参照してください。- トランザクション参加側関数またはブロックで、MicroTxクライアント・ライブラリで使用される
XADatasource
オブジェクトを指定します。リソース・マネージャに接続するための資格証明およびその他の詳細を指定します。//Example for a participant using an Oracle Database: OracleXADataSource dataSource = new oracle.jdbc.xa.client.OracleXADataSource(); dataSource.setURL(url); //database connection string dataSource.setUser(user); //username to access database dataSource.setPassword(password); //password to access database
アプリケーション開発者は、
XADataSource
を割り当てる際に、XA準拠JDBCドライバおよび必要なパラメータを設定する必要があります。MicroTxクライアント・ライブラリは、
XADatasource
オブジェクトを使用してデータベース接続を作成します。すべてのリソース・マネージャについてこのステップを繰り返します。
- トランザクション参加側の関数すなわちブロックで、
XADatasource
オブジェクトを初期化した後に次のコード行を1回だけ追加します。oracle.tmm.jta.TrmConfig.initXaDataSource(dataSource, creditDataSource)
ここで、
creditDataSource
は、以前に作成したDataSourceInfo
オブジェクトです。MicroTxクライアント・ライブラリは、このオブジェクトを使用してデータベースに接続し、XAトランザクションを開始し、準備、コミット、ロールバックなどの様々な操作を実行します。MicroTxライブラリは、依存関係インジェクションを使用してDMLを実行するためのSQL接続オブジェクトもアプリケーション・コードに提供します。
すべてのリソース・マネージャについてこのステップを繰り返します。
- JAX-RS APIを使用するSpring Bootアプリケーションの場合のみ、XAトランザクションに参加するリソース・エンドポイントを登録した後で次のタスクを実行します。
-
次のサンプル・コード・スニペットに示すように、準備、コミット、ロールバックのために、フィルタと
XAResourceCallbacks
を登録します。@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // Register the MicroTx XA resource callback which // coordinates with the transaction coordinator register(XAResourceCallbacks.class); // Register the filters for the MicroTx libraries that // intercept the JAX_RS calls and manage the XA transactions register(TrmTransactionResponseFilter.class); register(TrmTransactionRequestFilter.class); // Bind the connection ... } }
- リソース・マネージャごとにBeanを初期化します。次のサンプル・コード・スニペットでは、2つのBean (アプリケーションが使用するリソース・マネージャごとに1つ)を初期化する方法を示しています。次のコード・サンプルで、
departmentDataSource
およびcreditDataSource
は、アプリケーションのYAMLファイルで指定したXAデータ・ソースの名前です。後で@Inject
注釈を使用して参加側アプリケーションでこれらの接続が使用されることを確認するため、データ・ソースの名前を書き留めておきます。@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // Register the filters as shown in the previous step .... @Bean @TrmSQLConnection(name = "departmentDataSource") @Lazy @RequestScope public Connection departmentDSSqlConnectionBean(){ return new TrmConnectionFactory().getConnection("departmentDataSource"); } @Bean @TrmSQLConnection(name = "creditDataSource") @Lazy @RequestScope public Connection creditDSSqlConnectionBean(){ return new TrmConnectionFactory().getConnection("creditDataSource"); } } }
-
- 参加側サービスのコードに次の行を挿入して、アプリケーションがMicroTxクライアント・ライブラリによって渡された接続を使用するようにします。参加側アプリケーションの次のコードは、MicroTxクライアント・ライブラリによって作成された
connection
オブジェクトを注入します。アプリケーションで複数のリソース・マネージャを使用している場合は、XA準拠リソース・マネージャごとに次の方法で
connection
オブジェクトを注入します。@Inject @TrmSQLConnection(name = "creditDataSource") private Connection creditConnection;
ここで、
creditDataSource
は、oracle.tmm.jta.common.DataSourceInfo
パッケージのDataSourceInfo
クラスのdataSourceName
文字列に指定した値です。すべてのリソース・マネージャについてこのステップを繰り返します。
- 参加側サービスのコードに次の行を挿入して、参加側サービスがDML操作を実行するたびに、注入された
connection
オブジェクトを使用するようにします。Statement stmt1 = creditConnection.createStatement(); stmt1.execute(query); stmt1.close();
ここで、
creditConnection
は、前のステップで注入したConnection
オブジェクトの名前です。これらのコード行は、参加側サービスが実行するDML操作ごとに挿入します。DML操作ごとに
stmt1
やstmt2
などの新しい文オブジェクトを作成しますが、MicroTxクライアント・ライブラリによって作成された同一のcreditConnection
オブジェクトを使用します。すべてのリソース・マネージャについてこのステップを繰り返します。
- 変更内容を保存します。
MicroTxライブラリおよびXAトランザクション・プロトコルを使用するサンプルJAX-RSトランザクション参加側アプリケーションのソース・コードは、microtx-samples
GitHubリポジトリにあるdepartment-helidon-multiplerm
フォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。