Spring Boot DB連携

複数DBに接続するアプリケーションでSpring Bootの@Transactionalアノテーションの挙動を調べてみた

Spring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でDB更新処理を実装するようにすると、そのメソッド単位で、DB更新処理が成功した場合にコミットし、失敗した場合にロールバックをすることができるが、複数DBに接続するアプリケーションの場合は、@Transactionalアノテーション内でtransactionManager属性を指定すればよい。

今回は、Spring Bootアプリケーション内でMyBatisフレームワークを利用する状態で、OracleやSQL Serverに接続し@Transactionalアノテーションの挙動を調べてみたので、共有する。

前提条件

下記記事の実装が完了していること。

Oracle上でSpring Bootの@Transactionalアノテーションの挙動を調べてみたSpring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でD...

また、下記記事の前提条件を満たしていること。

Spring BootでSQL Serverに接続しMyBatisを利用してみた今回は、Spring Bootアプリケーションで接続するデータベースをSQL Serverに変更してみたので、そのサンプルプログラムを共...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。

build.gradleの内容は以下の通りで、SQL Serverに接続するためのJDBCライブラリを追加している。

application.propertiesの内容は以下の通りで、SQL Serverに接続するための接続設定を追加している。



「DesignEvo」は多くのテンプレートからロゴを簡単に作成できるツールだった多くのテンプレートが用意されていてロゴを簡単に作成できるツールの一つに、「DesignEvo」があります。今回は、「DesignEvo」...

また、1つのSpring Bootアプリケーションから、複数DBに接続できるようにするには、Configクラスを作成する必要がある。

OracleのConfigクラスの内容は以下の通りで、DB接続に必要なデータソースプロパティ、データソース、トランザクションマネージャ、セッションファクトリを生成している。

データソースプロパティは、application.propertiesに指定した「spring.datasource」から取得するようにしている。また、1つのDB接続定義には@Primaryアノテーションを付与する必要があるため、OracleのConfigクラスの各メソッドに@Primaryアノテーションを付与している。

SQL ServerのConfigクラスの内容は以下の通りで、@Primaryアノテーションを付与しない状態で、Oracleの場合と同様に、DB接続に必要なリソースを生成している。



「AOMEI Partition Assistant Standard(無料)版」は便利なパーティション管理ツールだったハードディスクの記憶領域を論理的に分割し、分割された個々の領域のことを、パーティションといいます。 例えば、以下の図の場合、C/D...

各DBのMapperインタフェースの内容は以下の通りで、Configクラスの@MapperScanアノテーション内のbasePackagesで指定したパッケージ内に、それぞれ作成している。

また、Mapperインタフェースから呼ばれるXMLファイルの内容は以下の通りで、前提条件の記事と同じ内容のSQLを記載している。



Code VillageはJavaScriptを中心としたサポート体制が充実したプログラミングスクールだったJavaScriptや、JavaScriptのフレームワーク「React」「Vue」を中心にオンラインで学習できるプログラミングスクール...

さらに、サービスクラスの内容は以下の通りで、前提条件の記事と同じ内容の検証を行う処理を、Oracle用とSQL Server用で作成している。

また、Spring Bootのメインクラスの内容は以下の通りで、サービスクラスの各メソッドを呼び出している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-multi-db-transactional/demo



freelance hubを利用して9万件を超える案件情報からJava Spring案件を検索してみたfreelance hubは、レバテックフリーランスやフリエン(furien)を始めとした多くのフリーランスエージェントの案件をまとめて...

サンプルプログラムの実行結果(Oracleの場合)

サンプルプログラムの実行結果は以下の通りで、Oracleデータベースに接続した場合に、同一トランザクション内でDB更新が成功するとコミット、失敗するとロールバックされることが確認できる。

1) 以下のように、DemoApplicationクラスで、Oracleに接続した際の動作検証を行う処理(demoServiceクラスのtransUserDataOraメソッド)を有効にする。
サンプルプログラムの実行結果(Oracle)_1

2) 以下のように、DemoServiceクラスで、Oracleに接続した際の2回目の氏名更新時の設定値を、更新成功する値に設定する。
サンプルプログラムの実行結果(Oracle)_2

3) 1)2)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果(Oracle)_3

4) 1)2)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、コミットされ氏名が更新されることが確認できる。

<実行前>

サンプルプログラムの実行結果(Oracle)_4_1

<実行後>

サンプルプログラムの実行結果(Oracle)_4_2

5) 以下のように、DemoServiceクラスで、Oracleに接続した際の2回目の氏名更新時の設定値を、更新失敗する値に設定する。
サンプルプログラムの実行結果(Oracle)_5

6) 1)5)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果(Oracle)_6

7) 1)5)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、ロールバックされ氏名が更新されないことが確認できる。

<実行前>

サンプルプログラムの実行結果(Oracle)_7_1

<実行後>

サンプルプログラムの実行結果(Oracle)_7_2



「HD Video Converter Factory Pro」は動画の形式変換や編集・録画等を行える便利ツールだった動画の形式変換や編集・録画等を行える便利ツールの一つに、「HD Video Converter Factory Pro」があります。ここ...

サンプルプログラムの実行結果(SQL Serverの場合)

サンプルプログラムの実行結果は以下の通りで、SQL Serverデータベースに接続した場合にも、同一トランザクション内でDB更新が成功するとコミット、失敗するとロールバックされることが確認できる。

1) 以下のように、DemoApplicationクラスで、SQL Serverに接続した際の動作検証を行う処理(demoServiceクラスのtransUserDataSsメソッド)を有効にする。
サンプルプログラムの実行結果(SQLServer)_1

2) 以下のように、DemoServiceクラスで、SQL Serverに接続した際の2回目の氏名更新時の設定値を、更新成功する値に設定する。
サンプルプログラムの実行結果(SQLServer)_2

3) 1)2)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果(SQLServer)_3

4) 1)2)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、コミットされ氏名が更新されることが確認できる。

<実行前>

サンプルプログラムの実行結果(SQLServer)_4_1

<実行後>

サンプルプログラムの実行結果(SQLServer)_4_2

5) 以下のように、DemoServiceクラスで、SQL Serverに接続した際の2回目の氏名更新時の設定値を、更新失敗する値に設定する。
サンプルプログラムの実行結果(SQLServer)_5

6) 1)5)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果(SQLServer)_6

7) 1)5)の状態で、実行前後でUSER_DATAテーブルの値を確認した結果は以下の通りで、ロールバックされ氏名が更新されないことが確認できる。

<実行前>

サンプルプログラムの実行結果(SQLServer)_7_1

<実行後>

サンプルプログラムの実行結果(SQLServer)_7_2

要点まとめ

  • Spring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でDB更新処理を実装するようにすると、そのメソッド単位で、DB更新処理が成功した場合にコミットし、失敗した場合にロールバックをすることができるが、複数DBに接続するアプリケーションの場合は、@Transactionalアノテーション内でtransactionManager属性を指定すればよい。