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

时间:2016-05-17 16:01:55

标签: spring-boot flyway

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

4 个答案:

答案 0 :(得分:13)

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

最简单的解决方案是使用@Primary(您已经做过)注释主数据源,然后让bootstrap将您的主数据源迁移到正常数据源中。方式。

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

@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();
     }
}

答案 1 :(得分:7)

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

https://flywaydb.org/documentation/migration/java

我不确定如何配置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();

答案 2 :(得分:3)

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

注释要由Flyway使用的任何数据源都可以解决问题。
像这样:

FlywayDataSource

答案 3 :(得分:0)

为此找到了一个简单的解决方案-我在创建电动势时添加了以下步骤:

@Qualifier(EMF2)
@Bean(name = EMF2)
public LocalContainerEntityManagerFactoryBean entityManagerFactory2(
    final EntityManagerFactoryBuilder builder
) {
    final DataSource dataSource = dataSource2();
    Flyway.configure()
          .dataSource(dataSource)
          .locations("db/migration/ds2")
          .load()
          .migrate();
    return builder
        .dataSource(dataSource)
        .packages(Role.class)
        .properties(jpaProperties2().getProperties())
        .persistenceUnit("domain2")
        .build();
}

我为此禁用了spring.flyway.enabled。

SQL文件位于resources / db / migration / ds1 / ...和resources / db / migration / ds2 /...