Sprign Boot/Doma 2/複数のデータソースを設定する
キーワード
- 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タスクを別名で作るのがいい。
作成日 2023-02-10
