Spring JPAで複数データベース(PostgreSQL)に接続する方法

Spring JPAで複数データベース(PostgreSQL)に接続する方法

JPAで複数データベースに接続するけど、トランザクション管理は別々にしたいです。例えば、MyDB1を更新して、そのあとにMyDB2更新時に失敗した場合に、MyDB1をロールバックせずにコミットしておきたい。

今回は2つのデータベースともPostgreSQL9.6を使用しています。

複数データベースに接続する

1つ目のDB接続情報をprimary、もう一つのDB接続情報をsecondaryとします。

application.ymlには以下のように記述します。

接続情報に対するクラスを定義します。接続情報を一つのクラスとして定義する為、2つのクラスを作成しておきます。

PrimaryConfig.java

SecondaryConfig.java

これで2つのデータベースに接続することが確認できます。但し、トランザクション管理は別になります。

サービスレベルで@Transactionalをつけると、「Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query」とエラーが出ますが、リポジトリレベルで@Transactionalとすると別トランザクション管理ができます。

2つのデータベースでトランザクション管理する2相コミット(2フェーズコミット)

データベース接続は確認できましたが、複数データベースでトランザクション管理ができるかというと、@Transactionalでは実現できず、以下ライブラリを使わないとだめなようです。

bitronixは情報量が少ないように思いますが、現在も開発されています。

Atomikosも現在も開発されています。ライブラリは他にもあるようです。Spring boot公式ではこの2つをサポートしているとのことです。

https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html

PostgreSQL9.6で2フェーズコミットをAtomikosかbitronixを使って試してみたいと思います。

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

コメントをどうぞ

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

CAPTCHA