こんにちは。フリューのジョンです。

個人的意見ではありますがSpring Data JPAのほうが好きですが、今回はDoma2を使った複数データベースアクセスを実装して躓いたので書かせていただきたいと思います。

概要

環境としましては以下のようになります。

spring-boot 1.5.3.RELEASE
doma-spring-boot-starter 1.1.0
spring-boot-starter-aop 1.5.4.RELEASE

複数のデータベースアクセスの具体的な要件は以下になります。

  • データベースアクセスをするメソッドに対して、アノテーションを付けてアクセス先を切り替える
  • アノテーションを付けていない場合はデフォルトのデータベースにアクセスする
  • 接続先はDomaの基本に合わせて、DataSourceの切り替えをしたい

以上の要件を満たすために、AbstractRoutingDataSourceとAnnotation、ThreadLocalを利用しました。

実装については、Qiitaの「Spring Bootで複数データベースを扱うウェブアプリケーションのサンプル」の記事を参考にさせていただきました。

実装

Daoには実装は加えません。

肝になるのは、AbstractRoutingDataSourceです。AbstractRoutingDataSourceはSpringのJDBCパッケージの中にあります。
このクラスを実装したモノを、Domaのconfigを継承したConfigrationクラスが返却することで対応が可能です。

ここで、AppConfigはルートである必要があります。(もしかすると、そうでなくてもいける方法があるのかもしれませんが、私が調べた限り出来ませんでした……)

接続先を保存するためにstaticでデータを作っておきます。ThreadLocalですので取扱には注意です。

メソッドに必要なアノテーションは以下のように設定します

アノテーションの実装は以下になります。
アノテーションがあるメソッドが動く前に接続先をHolderにセットして、動作した後に開放しています。

接続先はenumで持つようにします。

ここまでで実装終わりです。

使い方

以下のようになります。

まとめ

今回はアノテーションを使った振り分け方を行いましたが、リクエストパラメータやCookieを使って振り分けるというのも良いかと思います。

Doma2がConfigを勝手に参照してくれるのは、とても楽ですね。設定だけでうまくいきました。

最後に

弊社は、Springを実践利用してバリバリコード書きたいエンジニア募集中です!

詳しくはこちら