Spring项目如何配置Flyway实现PostgreSQL、MySQL多数据源独立迁移
Flyway多数据源独立迁移配置方案
第一步:禁用Flyway默认自动配置
默认Spring Boot的Flyway自动配置仅支持单数据源,需要先排除自动配置类,在启动类上添加如下注解:
@SpringBootApplication @EnableAutoConfiguration(exclude = FlywayAutoConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
提示:如果使用Flyway 9.x及以上版本,需要单独引入对应数据库的Flyway扩展依赖,例如MySQL需要引入
flyway-mysql依赖,避免出现不支持数据库的报错。
第二步:为两个数据源分别配置Flyway实例
2.1 调整LocalDBConfig配置
删除原有@FlywayDataSource注解,在类中新增对应PostgreSQL库的Flyway Bean,指定迁移脚本路径为db/migrate/manager,设置初始化时自动执行迁移:
@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" ) public DataSource customerDataSource() { return DataSourceBuilder.create().build(); } // 本地库对应的Flyway配置 @Primary @Bean(initMethod = "migrate") public Flyway localFlyway() { return Flyway.configure() .dataSource(customerDataSource()) .locations("classpath:db/migrate/manager") // 可选配置,可根据实际需求调整 .baselineOnMigrate(true) .cleanDisabled(true) .schemas("public") // PostgreSQL默认schema,按需修改 .build(); } @Bean(name = "localEntityManager") @Primary public LocalContainerEntityManagerFactoryBean localEntityManager() { // 原有逻辑保持不变 ... } @Bean @Primary public PlatformTransactionManager localTransactionManager() { // 原有逻辑保持不变 ... } }
2.2 调整JiraDBConfig配置
同样删除@FlywayDataSource注解,新增对应MySQL库的Flyway Bean,指定迁移脚本路径为db/migrate/jira:
@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" ) public DataSource jiraDataSource() { return DataSourceBuilder.create().build(); } // Jira库对应的Flyway配置 @Bean(initMethod = "migrate") public Flyway jiraFlyway() { return Flyway.configure() .dataSource(jiraDataSource()) .locations("classpath:db/migrate/jira") // 可选配置,可根据实际需求调整 .baselineOnMigrate(true) .cleanDisabled(true) .build(); } @Bean(name = "jiraEntityManager") public LocalContainerEntityManagerFactoryBean jiraEntityManager() { // 原有逻辑保持不变 ... } @Bean public PlatformTransactionManager jiraTransactionManager() { // 原有逻辑保持不变 ... } }
可选:参数外置到配置文件
如果不想把参数硬编码在配置类中,可以在application.properties中添加对应配置,通过@ConfigurationProperties绑定到Flyway实例即可:
# 本地PostgreSQL库Flyway配置 spring.flyway.local.locations=classpath:db/migrate/manager spring.flyway.local.baseline-on-migrate=true spring.flyway.local.clean-disabled=true # Jira MySQL库Flyway配置 db.jira.flyway.locations=classpath:db/migrate/jira db.jira.flyway.baseline-on-migrate=true db.jira.flyway.clean-disabled=true
验证方式
启动应用后,分别检查两个数据库中的flyway_schema_history表,会生成对应迁移脚本的执行记录,两个数据源的迁移完全独立互不影响。
内容的提问来源于stack exchange,提问作者Nikolay
相关产品推荐
相关产品推荐

