キーワード†
- Spring Boot
- Doma 2
- データソース
したいこと†
複数のデータソースを設定したい。
ここではふたつのデータソースalphaとbetaがあるとして。
どうやって†
プロパティファイルの設定†
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
データソースの設定†
alpha用データベースの設定†
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用データソースの設定†
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用データベースの設定†
alpha用データベースの設定から @Primary を除く。
beta用データソースの設定†
beta用データソースの設定から @Primary を除く。
beta用Autowireableの作成†
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
アノテーションの設定†
@ConfigAutowireable の代わりに @BetaDbConfigAutowireable をつける。
@Dao @BetaDbConfigAutowireable public interface *Dao { ... }
ちなみに†
Doma-GenなどのGradleタスクを別名で作るのがいい。