【问题标题】:Different migration scenarios for different datasources不同数据源的不同迁移场景
【发布时间】:2021-11-02 22:18:32
【问题描述】:

朋友们,如何使用Flyway配置多个数据库的迁移?在我的 Spring 应用程序中,我使用了 2 个数据库,第一个数据库(PostgreSQL)负责 Web,它存储用户、角色等数据,第二个数据库(MySQL)负责业务逻辑。数据库位于不同的主机上,并且没有以任何方式相互连接。当然,我的数据源具有不同的数据结构。

我已经配置了两个数据源,分别是LocalDBConfig和JiraDBConfig。

@Configuration
@PropertySource( { "classpath:application.properties" } )
@EnableJpaRepositories(
        basePackages = "net.komus.oksitreport.repo.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
    
    @Primary
    @Bean
    @ConfigurationProperties( prefix = "spring.datasource" )
    @FlywayDataSource
    public DataSource customerDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "localEntityManager")
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() {
        ...
    }
    
    @Bean
    @Primary
    public PlatformTransactionManager localTransactionManager() {
        ...
    }
    
}
@Configuration
@PropertySource( { "classpath:application.properties" } )
@EnableJpaRepositories(
        basePackages = "net.komus.oksitreport.repo.jira",
        entityManagerFactoryRef = "jiraEntityManager",
        transactionManagerRef = "jiraTransactionManager"
)
public class JiraDBConfig {
    
    @Bean
    @ConfigurationProperties( prefix = "db.jira.datasource" )
    @FlywayDataSource
    public DataSource jiraDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "jiraEntityManager")
    public LocalContainerEntityManagerFactoryBean jiraEntityManager() {
        ...
    }
    
    @Bean
    public PlatformTransactionManager jiraTransactionManager() {
        ...
    }
    
}

我已经按路径排列了迁移文件:

db/migrate/manager 路径应负责本地数据库配置迁移,db/migrate/jira 路径应负责 JiraDBConfig 迁移。
我不明白如何配置我需要的功能。

【问题讨论】:

    标签: java spring flyway


    【解决方案1】:

    我想你快到了。据我所知,没有开箱即用的方式让 flyway 同时处理两个数据库迁移。话虽如此,有一种方法可以通过一些手动配置来做到这一点。因此,根据您的要求考虑以下示例:

    @Configuration
    public class PostgresDbConfiguration {
    
        @Primary
        @Bean(name = "postgresDatasource")
        @ConfigurationProperties(prefix = "primary.datasource")
        @FlywayDataSource
        public DataSource dataSource() {
            return DataSourceBuilder.create().build();
        }
    
    }
    

    @Configuration
    public class MariaDbConfiguration {
    
        @Bean(name = "mariaDatasource")
        @ConfigurationProperties(prefix = "secondary.datasource")
        public DataSource dataSource() {
            return DataSourceBuilder.create().build();
        }
    
    }
    

    对于我们的用例,这将是我们将要迁移的两个数据库(以及后续数据源)。如您所见,我的postgresDatasource 被标记为@Primary

    对于主数据源,我们将让 Flyway 做自己的事情,因此需要进行的唯一配置如下:

    spring.flyway.locations=classpath:db/migration/postgresql
    

    对于辅助数据源 (mariaDatasource),您需要做的是创建一个 Flyway bean,它将手动迁移数据库。例如考虑以下内容:

    @Configuration
    public class FlywayConfig {
    
        private final DataSource mariaDatasource;
    
        public FlywayConfig(@Qualifier("mariaDatasource") DataSource mariaDatasource) {
            this.mariaDatasource = mariaDatasource;
        }
    
        @PostConstruct
        public void runMigration() {
            Flyway.configure()
                .dataSource(mariaDatasource)
                .locations("db/migration/mariadb")
                .baselineOnMigrate(true)
                .load()
                .migrate();
        }
    
    }
    

    如您所见,这个类被注入辅助数据源,用于手动创建Flyway 对象。然后它使用相关对象手动执行迁移。

    【讨论】:

    • @akotex,谢谢,你的例子帮我解决了问题
    • 如果对您有帮助请点赞
    • @akotex,我真的很想这样做,但我的名声仍然很小:-)
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2012-07-26
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多