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

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

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

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

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

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-jta.html

デフォルトで、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~のように指定しないといけないです。(ハマりました)

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

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

https://access.redhat.com/documentation/ja-jp/red_hat_jboss_bpm_suite/6.0/html/getting_started_guide/sect-installing_the_generic_deployable_package

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を指定する必要があります。分離レベルの設定がデフォルトなので何かおかしいかもしれません。これは課題として。。

https://github.com/takahashi-h5/jpa-bitronix

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

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

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA