web-dev-qa-db-ja.com

Spring BootアプリケーションでFlywayを使用した複数のデータソースの移行

Spring Bootベースのアプリでdb移行にFlywayを使用していますが、複数のデータソース戦略を使用しながらマルチテナンシーサポートを導入する必要があります。その一環として、複数のデータソースの移行もサポートする必要があります。すべてのデータソースは同じ構造を維持する必要があるため、すべてのデータソースの移行には同じ移行スクリプトを使用する必要があります。また、移行はアプリケーションの起動時に行われる必要があります(ビルド時ではなく、Mavenプラグインは複数のデータソースを移行するように構成できるようです)。これを達成するために使用する最良のアプローチは何ですか?アプリにはすでにデータソースBeanが定義されていますが、Flywayはプライマリデータソースに対してのみ移行を実行します。

16
Eli Avzak

Flywayは、Java内にコーディングされた移行をサポートしているため、アプリケーションの起動中にFlywayを起動できます。

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

構成ファイルを介してFlywayを構成して多数のデータソースをターゲットにする方法がわかりません。私自身の開発は、Javaを使用して、作業する必要があるデータソースごとにFlywayを呼び出すことに基づいています。SpringBootは、@FlywayDataSourceとマークされたBeanの自動配線をサポートしていますが、まだ確認していませんこれをどのように使用できるかについて説明します。

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();
8
Roger Thomas

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

同じ問題が発生しています... 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>
}
2
RobMcZag