【问题标题】:Spring Boot - Configure and initialise multiple datasourcesSpring Boot - 配置和初始化多个数据源
【发布时间】:2017-09-21 08:04:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-boot datasource liquibase


    【解决方案1】:

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

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

    【讨论】:

    • 对不起,但这并不能回答我关于初始化的问题。正如我上面写的,我可以配置两个数据源,但我无法让 liquibase 使用 Liquibase 初始化它们。除非您建议使用不同数据源的两个 liquibase bean。如果是这样,你能举个例子来说明如何做到这一点吗?
    【解决方案2】:

    我设法通过使用两个 Liquibase bean 来初始化这两个数据库。 在我的配置类中,我有以下内容

    @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
    

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 2019-05-15
      • 2016-12-16
      • 1970-01-01
      • 2021-12-03
      • 2021-03-16
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多