キーワード†
- 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タスクを別名で作るのがいい。