Search code examples
springspring-bootspring-dataliquibase

How to set up liquibase in Spring for multiple data sources?


I need to set up liquibase for two datasources in Spring, at the moment it seems that only one liquibase set up is possible and you can choose for which data source.


Solution

  • If you are using spring boot, here is the setup which can help you:

    Configuration class:

    @Configuration
    public class DatasourceConfig {
    
        @Primary
        @Bean
        @ConfigurationProperties(prefix = "datasource.primary")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.primary.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.secondary")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.secondary.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    
    
    ...
    
    }
    

    properties.yml

    datasource:
      primary:
        url: jdbc:mysql://localhost/primary
        username: username
        password: password
        liquibase:
          change-log: classpath:/db/changelog/db.primary.changelog-master.xml
      secondary:
        url: jdbc:mysql://localhost/secondary
        username: username
        password: password
        liquibase:
          change-log: classpath:/db/changelog/db.secondary.changelog-master.xml