home wiki.fukuchiharuki.me
Menu

#author("2023-02-10T00:29:18+00:00","default:haruki","haruki")
* キーワード [#w44ec138]
- Spring Boot
- Doma 2
- データソース

* したいこと [#q35610e3]

複数のデータソースを設定したい。

ここではふたつのデータソースalphaとbetaがあるとして。

* どうやって [#w85cd438]

** プロパティファイルの設定 [#y70504c5]

application.propertiesにalphaとbetaのプロパティを設定する。

 spring.datasource.alpha.url=jdbc:mysql://...
 spring.datasource.alpha.username=...
 spring.datasource.alpha.password=...
 spring.datasource.alpha.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.alpha.type=com.zaxxer.hikari.HikariDataSource
 spring.datasource.beta.url=jdbc:mysql://...
 spring.datasource.beta.username=...
 spring.datasource.beta.password=...
 spring.datasource.beta.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.beta.type=com.zaxxer.hikari.HikariDataSource

** データソースの設定 [#bf648dee]

*** alpha用データベースの設定 [#x103c562]

 package com.example.application.config.db
 
 import org.seasar.doma.jdbc.Config
 import org.seasar.doma.jdbc.dialect.Dialect
 import org.seasar.doma.jdbc.dialect.MysqlDialect
 import org.springframework.beans.factory.annotation.Qualifier
 import org.springframework.context.annotation.Primary
 import org.springframework.stereotype.Component
 import javax.sql.DataSource
 
 @Primary
 @Component(AlphaDbConfig.name)
 class AlphaDbConfig(
     @Qualifier(AlphaDbDataSource.dataSource) private val dataSource: DataSource
 ): Config {
     companion object {
         const val name = "alphaDbConfig"
     }
 
     override fun getDialect(): Dialect = MysqlDialect()
     override fun getDataSource(): DataSource = dataSource
     override fun getDataSourceName(): String = name
 }

*** alpha用データソースの設定 [#a36c7a3c]

 package com.example.application.config.db
 
 import org.springframework.beans.factory.annotation.Qualifier
 import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
 import org.springframework.boot.context.properties.ConfigurationProperties
 import org.springframework.context.annotation.Bean
 import org.springframework.context.annotation.Configuration
 import org.springframework.context.annotation.Primary
 import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
 import javax.sql.DataSource
 
 @Configuration
 class AlphaDbDataSource {
     companion object {
         const val dataSource = "dataSourceForAlpha"
         private const val dataSourceProperties = "dataSourcePropertiesForAlpha"
     }
 
     @Primary
     @Bean(dataSource)
     @ConfigurationProperties(prefix = "spring.datasource.alpha.configuration")
     fun dataSourceForAlpha(
         @Qualifier(dataSourceProperties) properties: DataSourceProperties
     ): DataSource = TransactionAwareDataSourceProxy(properties.initializeDataSourceBuilder().build())
 
     @Primary
     @Bean(dataSourceProperties)
     @ConfigurationProperties(prefix = "spring.datasource.alpha")
     fun dataSourcePropertiesForAlpha() = DataSourceProperties()
 }

*** beta用データベースの設定 [#cd8e593e]

alpha用データベースの設定から @Primary を除く。

*** beta用データソースの設定 [#n40dae69]

beta用データソースの設定から @Primary を除く。

*** beta用Autowireableの作成 [#v8b54bf4]

 package com.example.application.config.db
 
 import org.seasar.doma.AnnotateWith
 import org.seasar.doma.Annotation
 import org.seasar.doma.AnnotationTarget
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.beans.factory.annotation.Qualifier
 import org.springframework.stereotype.Repository
 
 @AnnotateWith(annotations = [
     Annotation(target = AnnotationTarget.CLASS, type = Repository::class),
     Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Autowired::class),
     Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = Qualifier::class, elements = "\"${BetaDbConfig.name}\"")
 ])
 annotation class BetaDbConfigAutowireable

** アノテーションの設定 [#v0af7e0c]

@ConfigAutowireable の代わりに @BetaDbConfigAutowireable をつける。

 @Dao
 @BetaDbConfigAutowireable
 public interface *Dao {
   ...
 }

* ちなみに [#sb59e90b]

Doma-GenなどのGradleタスクを別名で作るのがいい。