Spring Boot+JPA+bitronixで2相コミットを実装する方法

Spring Boot+JPA+bitronixで2相コミットを実装する方法

Spring bootバージョン
2.2.4.RELEASE

Bitronix Transaction Managerを使って2相コミットを実装してみます。

build.gradleには以下1行を追記します。

compile group: 'org.springframework.boot', name: 'spring-boot-starter-jta-bitronix', version: '2.2.4.RELEASE'

「Gradleプロジェクトのリフレッシュ」で依存関係を解決しておきます。これでJTAはbitronixに勝手に変更されています。

38. Distributed Transactions with JTA

デフォルトで、transaction-logsディレクトリ配下にpart1.btm、part2.btmが作成されます。このディレクトリが作成されたら、JTAはbitronixになっています。

application.ymlに設定を記述することができる

application.ymlにspring.jta.bitronix.properties.xxxを設定します。その値は、bitronix.tm.Configurationクラスの値にバインドされる仕組みのようです。bitronix.tm.Configurationクラス参照ください。

設定可能プロパティ一覧

spring.jta.bitronix.properties.resource-configuration-filenameで指定するファイル名は、./src/main/resources~のように指定しないといけないです。(ハマりました)

resource-configuration-filename: ./src/main/resources/db.properties

Tomcat上で動かすには面倒くさそう

bitronixのライブラリのソースを追うと、String configurationFilename = System.getProperty("bitronix.tm.configuration");という1文があってこのファイルはオプションから指定して読み込むようです。詳細は以下記載があります。

3.2.2. 汎用デプロイ可能パッケージのインストール | Red Hat Product Documentation
3.2.2. 汎用デプロイ可能パッケージのインストール | Red Hat Documentation

Tomcat上で動くか動作確認はしていません。ローカルで動作確認しました。

JTAをbitronixに変更することは出来たのですが、2相コミットを実装するのは非常に面倒です。

とにかくドキュメントがわかりづらく、しかも情報が少ないのでハマります。bitronixのトランザクションマネージャをJTATransactionManagerでラップしてあげる必要があるようです。(多分。。)

org.hibernate.engine.transaction.jta.platform.internal.BitronixJtaPlatformクラスとかorg.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatformを継承しているクラスの一覧を見たらわかりやすいかもしれないです。(AtomikosJtaPlatformクラスの抽象クラスもAbstractJtaPlatformとなっています)

複数のXAデータソースはMyDataSourceクラスにオンコーディングしています。データベースはPostgreSQL前提で、テーブルが存在する前提です。MySQLだったらもっと簡単かもしれないです。ORマッパーは関係ないはずです。(Mybatisでもいけるはずでしょう)

サービスのメソッドで@TransactionalアノテーションでtransactionManagerを指定する必要があります。分離レベルの設定がデフォルトなので何かおかしいかもしれません。これは課題として。。

GitHub - takahashi-h5/jpa-bitronix
Contribute to takahashi-h5/jpa-bitronix development by creating an account on GitHub.

2相コミットにはPostgreSQLの設定ファイルも修正が必要です。以下参照ください。

トランザクションの準備は無効にされているためできません。

Linux環境でTomcatコンテナにデプロイする際のログ出力指定

Spring Bootでジャーナルログを出力した際はプロジェクト直下に出力されたのですが、Linux環境の場合は、Tomcat/bin/setenv.shでログ出力場所を指定する必要があるようです。

setenv.shのCATALINA_OPTSに記述して、Tomcat起動時に設定値を読み込ませます。

CATALINA_OPTS="-Dbtm.root=$CATALINA_HOME -Dbitronix.tm.journal.disk.logPart1Filename=$CATALINA_HOME/logs/btm1.tlog -Dbitronix.tm.journal.disk.logPart2Filename=$CATALINA_HOME/logs/btm2.tlog"

これでTomcat再起動すれば$CATALINA_HOME/logs配下にジャーナルログが出力されるはずです。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました