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に勝手に変更されています。
デフォルトで、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文があってこのファイルはオプションから指定して読み込むようです。詳細は以下記載があります。
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を指定する必要があります。分離レベルの設定がデフォルトなので何かおかしいかもしれません。これは課題として。。
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配下にジャーナルログが出力されるはずです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント