7.11.3.3 非XA JDBCリソースを使用するJAX-RSアプリケーションの構成

XAをサポートしないJDBCリソースを使用する場合は、この項に記載されている情報を使用してJAX-RS参加側アプリケーションを構成します。

アプリケーションは、複数のXA準拠リソース・マネージャに接続できます。また、アプリケーションは1つの非XAリソースに接続できます。
  1. 1つのリソース・マネージャを使用する場合は、すべてのMicroTxクライアント・ライブラリ・プロパティの値を1つのファイル(tmm.propertiesファイルなど)に指定します。アプリケーションで複数のリソース・マネージャを使用している場合は、このステップをスキップします。

    oracle.tmm.xa.XaSupportfalseoracle.tmm.xa.LLRSupportまたはoracle.tmm.xa.LRCSupporttrueに設定されていることを確認します。

    • ロギング・ラスト・リソース(LLR)の最適化を有効にするには、環境変数に次の値を設定します。
      oracle.tmm.xa.XaSupport = false
      oracle.tmm.xa.LLRSupport = true
      oracle.tmm.xa.LRCSupport = false
      oracle.tmm.TcsConnPoolSize = 15
      oracle.tmm.CallbackUrl = https://bookHotel-app:8081
      oracle.tmm.PropagateTraceHeaders = true
      oracle.tmm.TransactionTimeout = 60000
    • ラスト・リソース・コミット(LRC)の最適化を有効にするには、環境変数に次の値を設定します。
      oracle.tmm.xa.XaSupport = false
      oracle.tmm.xa.LLRSupport = false
      oracle.tmm.xa.LRCSupport = true
      oracle.tmm.TcsConnPoolSize = 15
      oracle.tmm.CallbackUrl = https://bookHotel-app:8081
      oracle.tmm.PropagateTraceHeaders = true
      oracle.tmm.TransactionTimeout = 60000
  2. アプリケーションで複数のリソース・マネージャを使用している場合は、次のステップを実行して、MicroTxクライアント・ライブラリのプロパティ値を構成します。1つのリソース・マネージャを使用している場合は、このステップをスキップします。
    1. リソース・マネージャごとに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注釈を使用して、アプリケーションでこれらのデータ・ソースが使用されることを確認します。

    2. 作成したDataSourceInfoオブジェクトごとに、次のMicroTxクライアント・ライブラリ・プロパティの1つのみを入力します。次の例では、creditDataSourceオブジェクトのプロパティ値を指定します。同様に、他のリソース・マネージャのプロパティ値を指定できます。値を指定しない場合、リソースはデフォルトでXA準拠とみなされます。
      • XA準拠リソースの場合は、creditDataSource.setXaSupport();と入力します。
      • LLRの最適化を使用する非XAリソースの場合は、 creditDataSource.setLLRSupport();と入力します。
      • LRCの最適化を使用する非XAリソースの場合は、 creditDataSource.setLRCSupport();と入力します。
  3. 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>
  4. セッション・アフィニティを有効にします。「セッション・アフィニティの有効化」を参照してください。
  5. Datasourceオブジェクトを初期化します。

    MicroTxライブラリは、データ・ソース・オブジェクトにアクセスする必要があります。データ・ソース・オブジェクトを使用してjava.sql.Connectionオブジェクトを作成し、リソース・マネージャに接続します。次のコードは、データ・ソース・オブジェクトを定義する方法を示しています。

    このコードはアプリケーションの最初に指定する必要があります。したがって、initNonXaDataSourceメソッドは、サーバーの起動直後に、他のすべてのリクエストが処理される前にコールされます。

    • アプリケーションで1つのリソース・マネージャを使用している場合は、次のようにデータ・ソースを初期化します。

      class oracle.tmm.jta.TrmConfig
      static void initNonXaDataSource(DataSource NonXaDs)
    • アプリケーションで複数のリソース・マネージャを使用している場合は、非XA JDBCリソースに対して次の方法でデータ・ソース・オブジェクトを初期化します。参加側サービスは複数のXA準拠リソース・マネージャに接続できますが、1つのトランザクションでサポートされる非XAリソースは1つのみです。

      class oracle.tmm.jta.TrmConfig
      static void initNonXaDataSource(DataSource departmentDataSource, DataSourceInfo departmentDataSourceInfo)

      ここで、dataSourceInfoは、ステップ2で作成したオブジェクトです。

  6. トランザクション参加側関数またはブロックで、MicroTxライブラリで使用されるDataSourceオブジェクトを指定します。リソース・マネージャに接続するための資格証明およびデータベース・ドライバの詳細を指定します。次の例は、MySQLデータベースをLLRとして使用する場合に指定する必要がある詳細を示しています。同様に、他のデータベースの資格証明およびデータベース・ドライバ情報を指定できます。
    //Example for a participant using a MySQL database as resource manager
    this.dataSource = PoolDataSourceFactory.getPoolDataSource();
    this.dataSource.setURL(url); //Database connection string
    this.dataSource.setUser(user); //User name to access the database
    this.dataSource.setPassword(password); //Password to access the database
    //Database driver information for the MySQL database.
    //Provide the JDBC driver information that is specific to your database.
    this.dataSource.setConnectionFactoryClassName("com.mysql.cj.jdbc.MysqlDataSource");
    this.dataSource.setMaxPoolSize(15);

    アプリケーション開発者は、DataSourceを割り当てる際に、データベース固有のJDBCドライバおよび必要なパラメータを設定する必要があります。

    MicroTxライブラリは、DataSourceオブジェクトを使用してデータベース接続を作成します。

  7. トランザクション参加側の関数すなわちブロックで、Datasourceオブジェクトを初期化した後に次のコード行を1回だけ追加します。MicroTxライブラリは、このオブジェクトを使用してデータベース・トランザクションを開始します。MicroTxライブラリは、依存関係インジェクションを使用してDMLを実行するためのSQL接続オブジェクトもアプリケーション・コードに提供します。
    oracle.tmm.jta.TrmConfig.initNonXaDataSource((DataSource) NonXaDs);

    ここで、DatasourceはJTAで定義されたインタフェースであり、JDBCドライバによって実装が提供されます。

  8. 参加側サービスのコードに次の行を挿入して、アプリケーションがMicroTxライブラリによって渡された接続を使用するようにします。参加側アプリケーションの次のコードは、MicroTxライブラリによって作成されたconnectionオブジェクトを注入します。
    @Inject @TrmNonXASQLConnection private Connection connection;
  9. 参加側サービスにコードを挿入して、参加側サービスがDML操作を実行するたびに、注入されたconnectionオブジェクトを使用するようにします。ビジネス・シナリオに基づいて、注入されたconnectionオブジェクトを使用するコードを作成できます。次に、例のコード・スニペットを示します。
    Statement stmt1 = connection.createStatement();
    stmt1.execute(query);
    stmt1.close();

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

  10. JAX-RS APIを使用するSpring Bootアプリケーションの場合のみ、次のサンプル・コード・スニペットに示すように、準備、コミット、ロールバックなどのXAResourceコールバックと様々なフィルタを登録します。
    @Component
    public class JerseyConfig extends ResourceConfig
    {
        public JerseyConfig()
        {
            register(XAResourceCallbacks.class);
            register(TrmTransactionResponseFilter.class);
            register(TrmTransactionRequestFilter.class);
            register(new AbstractBinder() {
                @Override
                protected void configure() {
                bindFactory(TrmXAConnectionFactory.class).to(XAConnection.class);
                }
            });
        }
    }

    これは、XAトランザクションに参加するリソース・エンドポイントの登録に加えて行います。

  11. 変更内容を保存します。

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