Spring Boot - 配置并初始化多个数据源

时间:2017-04-24 14:58:55

标签: java spring spring-boot datasource liquibase

我使用Spring Boot和Liquibase为我的项目初​​始化数据库。由于新的要求,我必须在两个不同的模式之间拆分数据库表。

我已经设法使用@Primary注释为我的项目配置了两个数据源,但我想知道是否有办法分别初始化两个数据库,为每个数据库创建不同的表。

目前我只能使用我原来拥有的liquibase yaml脚本初始化我的主数据库

2 个答案:

答案 0 :(得分:1)

是的,Spring中可能有多个DataSource或任何类型的bean。只需要确保Spring能够识别自动装配哪个实例,所以基本上

  1. 使用bean id
  2. 自动装配时使用@Qualifier

答案 1 :(得分:1)

我设法使用两个Liquibase bean初始化两个数据库。 在我的Configuration类中,我有以下

@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "primaryLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.primary.liquibase")
public LiquibaseProperties primaryLiquibaseProperties() {
    return new LiquibaseProperties();
}

@Bean(name = "liquibase")
public SpringLiquibase primaryLiquibase(@Qualifier("primaryLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
    SpringLiquibase primary = new SpringLiquibase();
    primary.setDataSource(dataSource());
    primary.setChangeLog(primaryLiquibaseProperties().getChangeLog());

    return primary;
}

@Bean(name = "metadata_datascource")
@ConfigurationProperties("spring.metadata_datascource")
public DataSource metadataDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "metadataLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.metadate.liquibase")
public LiquibaseProperties metadataLiquibaseProperties() {
    return new LiquibaseProperties();
}

@Bean(name = "metadata-liquibase")
public SpringLiquibase metadataLiquibase(@Qualifier("metadataLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
    SpringLiquibase metadata = new SpringLiquibase();
    metadata.setDataSource(metadataDataSource());
    metadata.setChangeLog(metadataLiquibaseProperties().getChangeLog());

    return metadata;
}

在我的属性中我有:

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: ...
    username: abc
    password: abc
    jpa:
      hibernate:
        ddl-auto: update
  metadata_datascource:
    driver-class-name: org.postgresql.Driver
    url: ...
    username: abc
    password: abc
    jpa:
      hibernate:
        ddl-auto: update

liquibase-changelogs:
  primary:
    liquibase:
        change-log: classpath:db/changelog/primary.yaml
  metadata:
    liquibase:
        change-log: classpath:db/changelog/metadata.yaml