Spring 启动 - 配置和初始化多个数据源

Spring Boot - Configure and initialise multiple datasources

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

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

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

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

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

我设法使用两个 Liquibase bean 初始化了两个数据库。 在我的配置中 class 我有以下内容

@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