7.10.3.2 複数のXA準拠リソース・マネージャを使用するSpring Bootアプリケーションの構成

複数のXA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してSpring Boot参加側アプリケーションを構成します。

アプリケーションは、複数のXA準拠リソース・マネージャに接続できます。また、アプリケーションは1つの非XAリソースに接続できます。
  1. MicroTxライブラリ・ファイルをSpring Boot 3.xアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは24.4リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。Spring Boot 3.xアプリケーションは、Java 17で動作します。
    • JDBCアプリケーションでは、microtx-spring-boot-starterファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter</artifactId>
           <version>24.4</version>
      </dependency>
    • HibernateがJPAプロバイダの場合は、microtx-spring-boot-starterおよびmicrotx-spring-boot-starter-hibernateファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter</artifactId>
           <version>24.4</version>
      </dependency>
      
      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter-hibernate</artifactId>
           <version>24.4</version>
      </dependency>
    • EclipseLinkがJPAプロバイダの場合は、microtx-spring-boot-starterおよびmicrotx-spring-boot-starter-eclipselinkファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter</artifactId>
           <version>24.4</version>
      </dependency>
      
      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter-eclipselink</artifactId>
           <version>24.4</version>
      </dependency>
    • JDBCアプリケーションでは、microtx-spring-boot-jaxrs-starterファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-jaxrs-starter</artifactId>
           <version>24.4</version>
      </dependency>
    • HibernateがJPAプロバイダの場合は、microtx-spring-boot-jaxrs-starterおよびmicrotx-spring-boot-starter-hibernateファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-jaxrs-starter</artifactId>
           <version>24.4</version>
      </dependency>
      
      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter-hibernate</artifactId>
           <version>24.4</version>
      </dependency>
    • EclipseLinkがJPAプロバイダの場合は、microtx-spring-boot-jaxrs-starterおよびmicrotx-spring-boot-starter-eclipselinkファイルを使用します。

      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-jaxrs-starter</artifactId>
           <version>24.4</version>
      </dependency>
      
      <dependency>
           <groupId>com.oracle.microtx</groupId>
           <artifactId>microtx-spring-boot-starter-eclipselink</artifactId>
           <version>24.4</version>
      </dependency>
  2. Spring JAX-RSアプリケーションの場合のみ、MicroTxライブラリがJAX-RSコールをインターセプトしてトランザクションを管理できるように、次のフィルタを登録する必要があります。Spring RESTアプリケーションでは、このステップをスキップできます。
    import org.glassfish.jersey.server.ResourceConfig;
    ...
    @Component
    public class Configuration extends ResourceConfig {
        public Configuration() {
    ...
          register(TrmTransactionRequestFilter.class);
          register(TrmTransactionResponseFilter.class);
          register(JaxRsXACallbackResource.class);
    }
  3. com.oracle.microtx.common.MicroTxConfigパッケージをインポートします。
    import com.oracle.microtx.common.MicroTxConfig;
  4. リソース・マネージャごとに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注釈を使用して、アプリケーションでこれらのデータ・ソースが使用されることを確認します。

  5. 作成したDataSourceInfoオブジェクトごとに、次のMicroTxクライアント・ライブラリ・プロパティの1つのみを入力します。次の例では、creditDataSourceオブジェクトのプロパティ値を指定します。同様に、他のリソース・マネージャのプロパティ値を指定できます。値を指定しない場合、リソースはデフォルトでXA準拠とみなされます。
    • XA準拠リソースの場合は、次を入力します:
      creditDataSource.setXaSupport();
    • Oracle RACデータベースの場合は、次のように入力します:
      creditDataSource.setRAC(true);
    • LLRの最適化を使用する非XAリソースの場合は、次を入力します:
      creditDataSource.setLLRSupport();
    • LRCの最適化を使用する非XAリソースの場合は、次を入力します:
      creditDataSource.setLRCSupport();
  6. XADatasourceオブジェクトを初期化します。アプリケーションで複数のリソース・マネージャを使用している場合は、XA準拠リソース・マネージャごとに次の方法でXADatasourceオブジェクトを初期化します。

    MicroTxクライアント・ライブラリは、XADatasourceオブジェクトにアクセスする必要があります。このオブジェクトを使用してXAConnectionオブジェクトおよびXAResourceオブジェクトを作成し、リソース・マネージャまたはデータベース・サーバーに接続します。次のコードでは、接続オブジェクトを作成する際にアプリケーション・コードの先頭にXADatasourceオブジェクトをどのように定義するかを示しています。

    class oracle.tmm.jta.MicroTxConfig
    static void initXaDataSource(XADataSource dataSource, DataSourceInfo creditDataSource)

    ここで、creditDataSourceは、以前に作成したDataSourceInfoオブジェクトです。

    すべてのリソース・マネージャについてこのステップを繰り返します。

    XADataSourceの詳細は、https://docs.oracle.com/javase/8/docs/api/javax/sql/XADataSource.htmlを参照してください。

  7. トランザクション参加側関数またはブロックで、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オブジェクトを使用してデータベース接続を作成します。

    すべてのリソース・マネージャについてこのステップを繰り返します。

  8. トランザクション参加側の関数すなわちブロックで、XADatasourceオブジェクトを初期化した後に次のコード行を1回だけ追加します。
    oracle.tmm.jta.MicroTxConfig.initXaDataSource(dataSource, creditDataSource)

    ここで、 creditDataSourceは、以前に作成したDataSourceInfoオブジェクトです。

    MicroTxクライアント・ライブラリは、このオブジェクトを使用してデータベースに接続し、XAトランザクションを開始し、準備、コミット、ロールバックなどの様々な操作を実行します。MicroTxライブラリは、依存関係インジェクションを使用してDMLを実行するためのSQL接続オブジェクトもアプリケーション・コードに提供します。

    すべてのリソース・マネージャについてこのステップを繰り返します。

  9. 参加側サービスのコードに次の行を挿入して、アプリケーションがMicroTxクライアント・ライブラリによって渡された接続を使用するようにします。参加側アプリケーションの次のコードは、MicroTxクライアント・ライブラリによって作成されたconnectionオブジェクトを注入します。

    アプリケーションで複数のリソース・マネージャを使用している場合は、XA準拠リソース・マネージャごとに次の方法でconnectionオブジェクトを注入します。

    次の例では、XA準拠リソース・マネージャごとに1つずつ、2つの接続を追加する方法について説明します。接続を注入する場合は、microTxSqlConnectionをコールし、その後にデータ・ソースの名前を指定します。

    //Initialize the application context
    private ApplicationContext applicationContext;
    //Connection for XA-compliant resource manager 1
    private Connection connection;
    //Connection for XA-compliant resource manager 2
    private Connection creditConnection;
    
    @Autowired
        public AccountService(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
            try {
                // Inject the connections for XA-compliant resource manager 1.
                // Specify the name of the data source associated with XA-compliant resource manager 1.            
                connection =  (Connection) applicationContext.getBean("microTxSqlConnection", "departmentDataSource");
                // Inject the connections for XA-compliant resource manager 2.
                // Specify the name of the data source associated with XA-compliant resource manager 2. 
                creditConnection =  (Connection) applicationContext.getBean("microTxSqlConnection","creditDataSource");
            } catch (ClassCastException ex) {
                LOG.info(ex.getMessage());
            }
       }

    ここで、creditDataSourceは、oracle.tmm.jta.common.DataSourceInfoパッケージのDataSourceInfoクラスのdataSourceName文字列に指定した値です。

    すべてのリソース・マネージャについてこのステップを繰り返します。

  10. 参加側サービスのコードに次の行を挿入して、参加側サービスがDML操作を実行するたびに、注入されたconnectionオブジェクトを使用するようにします。
    Statement stmt1 = creditConnection.createStatement();
    stmt1.execute(query);
    stmt1.close();

    ここで、creditConnectionは、前のステップで注入したConnectionオブジェクトの名前です。

    これらのコード行は、参加側サービスが実行するDML操作ごとに挿入します。DML操作ごとにstmt1stmt2などの新しい文オブジェクトを作成しますが、MicroTxクライアント・ライブラリによって作成された同一のcreditConnectionオブジェクトを使用します。

    すべてのリソース・マネージャについてこのステップを繰り返します。

  11. 変更内容を保存します。
複数のSpring Bootトランザクション参加側サービスがある場合は、すべての参加側サービスでこれらのステップを完了します。

MicroTxライブラリおよびXAトランザクション・プロトコルを使用するサンプルSpring RESTトランザクション参加側アプリケーションのソース・コードは、microtx-samples GitHubリポジトリにあるdepartment-spring-multiplermフォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。