home wiki.fukuchiharuki.me
Menu

キーワード

  • 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タスクを別名で作るのがいい。