■応用の森 Spring Boot 複数のJDBCデータソースに接続する |
「■応用の森 SpringMVC編 No004」で紹介した、複数JDBCデータソース接続の Spring Boot版のご紹介です。 ご承知の通り、Spring Bootでは、XML設定ファイルが使えないため、Configクラスでの設定となります。 今回は、「■Spring Boot の小径 4-6)MyBatisによるDB連携」で説明した MybatisConfig.javaを改造することで実現していますので、まずこちらを理解している前提で話を進めます。 使用するDBの環境や、Mapperインターフェース、MapperXMLも 「■応用の森 SpringMVC編 No004」と全く同じものを使用します。 |
では、まずJDBCドライバ接続情報ファイルですが、 「■Spring Boot の小径 4-6)MyBatisによるDB連携」では、 application.propertiesを使用しましたが、今回は、application.ymlを使うことにしました。 理由は特にありませんが、強いて言うなら自分自身がまだ修行中の身で、「色々やってみる!」を座右の銘にしているので こちらの方法を取り入れてみました。 実際やってみると、複数のデータソースを管理する上ではapplication.ymlの方がタイプ量も少なくて見やすいと思いました。 ではその実体。 src/main/resources/application.yml 見れば一目瞭然と思いますが、2種類のDBに接続するために primary と secondary のキーワードを付けた接続情報を2種類定義しています。 Spring-MVC編での例に倣ってこちらも同じく、 プライマリDBがPostgreSQL。セカンダリDBが MariaDBという想定です。 あと、「■応用の森 Spring-MVC編 No004」と同じく、 Mybatis設定情報のMapperXMLファイルのロケーションをプライマリ用とセカンダリ用に一段深くしています。 |
次にここが一番重要な、Configクラスの説明です。 「■Spring Boot の小径 4-6)MyBatisによるDB連携」で使った MybatisConfig.javaを改造します(というか新しく作りなおします) プライマリ用とセカンダリ用にクラスをそれぞれ分けます。 プライマリ用クラス「src/main/java/jp/dip/arimodoki/config/MybatisPrimaryConfig.java」 セカンダリ用クラス「src/main/java/jp/dip/arimodoki/config/MybatisSecondaryConfig.java」 どちらもやっていることはほとんど同じですが、 @ConfigurationPropertiesアノテーションで、application.ymlから読み込む接続情報を spring.mybatis.primary / spring.mybatis.secondary で切り分けています。 @MapperScanアノテーションで、Mapperインターフェースのパッケージ階層basePackagesを primary /secondaryに一段深くしています。 あと、それぞれのメソッドに付与するBeanの名称を、primaryXXXX / secondaryXXXX の様に付与しています。 |
続いてMapper関連の説明ですが、 ここは「■応用の森 Spring-MVC編 No004」と全く同じで、 プライマリ用:GraphMapper.java、GraphMapper.xml セカンダリ用:UserMapper.java、UserMapper.xml で、パッケージ階層をプライマリ用、セカンダリ用に一段深くしたので、それに対する修正を行います。 プライマリ用MapperXML「WebContent/WEB-INF/mappers/primary/GraphMapper.xml」 セカンダリ用MapperXML「WebContent/WEB-INF/mappers/secondary/UserMapper.xml」 それぞれに大きな変更はありませんが、Mapperインタフェースを指定する、 namespaceのパッケージ階層で、primary/secondary が追加されています。 プライマリ用Mapperインターフェース「src/main/java/jp/dip/arimodoki/mapper/primary/GraphMapper.java」 セカンダリ用Mapperインターフェース「src/main/java/jp/dip/arimodoki/mapper/secondary/UserMapper.java」 それぞれに大きな変更はありませんが、インターフェースの配置場所が変わったので、 パッケージ名が修正されています。 |
最後に、MapperインターフェースをDIするビジネスロジック(サービスロジック)の修正です。 プライマリ用DB処理ビジネスロジック「src/main/java/jp/dip/arimodoki/blogic/BlChartImpl.java」 セカンダリ用DB処理ビジネスロジック「src/main/java/jp/dip/arimodoki/blogic/BlUser.java」 これらも内容に大きな変更はありませんが、Mapperインターフェースのパッケージ階層が変わった事による import宣言の修正と、あとひとつ重要な修正点として、 @Transactionalアノテーションの使い方ですが、プライマリ用とセカンダリ用Configクラスで TransactionManagerを分けたので、どちらのTransactionManagerを使うかを指定する必要があります。 プライマリ用のDBを操作するメソッドに、secondaryTransactionManager を指定しても Transactionは効かないので注意が必要です。 あと、一つのメソッドには一つの@Transactionalアノテーションしか指定できないので、 一つのメソッド内で、プライマリ/セカンダリ両方のDB操作を行う場合のTransactionはできないので、 そういう設計を行わないように注意する必要があります。 それ以外のコントローラ層や、View(HTL)は全く変更する必要はなく、そのまま使用可能です。 |
説明は以上です。 そして、「■応用の森 Spring-MVC編 No004」と理由は同じく、 説明のみで動作サンプルはありません。 ※)ちゃんと動くことは確認していますが 「■応用の森 Spring-MVC編 No004」でも説明した通り、 元々はすでに解説しているプログラムの改造なので それぞれ元の説明を見てもらえれば、コントローラやView(HTML)のサンプルも展示してありますので それらを有効活用して自分なりに挑戦してみてください。 |
最後になりましたが、 参考にさせていただいたサイトをご紹介しておきます Spring BootとMyBatisで複数のDBを扱うためのapplication.properties作成方法 |
Spring Bootの小技集 ![]() |
Spring Boot 複数のJDBCデータソースに接続する |