在Spring Boot应用程序中使用Flyway进行多个数据源迁移

Eli*_*zak 15 flyway spring-boot

我们在基于Spring Boot的应用程序中使用Flyway进行数据库迁移,现在我们需要在使用多个数据源策略时引入多租户支持.作为其中的一部分,我们还需要支持多个数据源的迁移.所有数据源都应保持相同的结构,因此应使用相同的迁移脚本来迁移所有数据源.此外,迁移应该在应用程序启动时发生(与构建时间相反,而maven插件似乎可以配置为迁移多个数据源).为实现这一目标,最好的方法是什么?该应用程序已定义了数据源bean,但Flyway仅针对主数据源执行迁移.

Jac*_*gen 13

要让@Roger Thomas更多地回答Spring Boot方式:

最简单的办法是与注释您的主数据源@Primary(你已经做了),只是让引导迁移的主要数据源的"正常"的方式.

对于其他数据源,请手动迁移这些源:

@Configuration
public class FlywaySlaveInitializer {

     @Autowired private DataSource dataSource2;
     @Autowired private DataSource dataSource3;
     //other datasources

     @PostConstruct
     public void migrateFlyway() {
         Flyway flyway = new Flyway();
         //if default config is not sufficient, call setters here

         //source 2
         flyway.setDataSource(dataSource2);
         flyway.setLocations("db/migration_source_2");
         flyway.migrate();

         //source 3
         flyway.setDataSource(dataSource3);
         flyway.setLocations("db/migration_source_3");
         flyway.migrate();
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 将sql文件放在哪里用于第二个数据库?他们将如何区分? (4认同)
  • 确保设置“flyway.setBaselineOnMigrate(true)”。这使得 Flyway 能够为迁移脚本设置其版本跟踪表。 (2认同)

Rob*_*Zag 8

遇到同样的问题...我查看了包spring-boot-autoconfigure中 V 2.2.4 的工件org.springframework.boot.autoconfigure.flyway,发现了一个注释FlywayDataSource

注释任何您希望 Flyway 使用的数据源都可以解决问题。
像这样的东西:

@FlywayDataSource
@Bean(name = "someDatasource")
public DataSource someDatasource(...) {
        <build and return your datasource>
}
Run Code Online (Sandbox Code Playgroud)


Rog*_*mas 7

Flyway支持在Java中编码的迁移,因此您可以在应用程序启动期间启动Flyway.

https://flywaydb.org/documentation/migration/java
Run Code Online (Sandbox Code Playgroud)

我不确定你如何配置Flyway通过其配置文件定位大量数据源.我自己的开发是基于使用Java来调用Flyway,每个数据源需要一次.Spring Boot支持标记为@FlywayDataSource的bean的自动装配,但我还没有研究如何使用它.

对于in-java解决方案,代码可以如此简单

    Flyway flyway = new Flyway();

    // Set the data source
    flyway.setDataSource(dataSource);

    // Where to search for classes to be executed or SQL scripts to be found
    flyway.setLocations("net.somewhere.flyway");

    flyway.setTarget(MigrationVersion.LATEST);
    flyway.migrate();
Run Code Online (Sandbox Code Playgroud)