web-dev-qa-db-fra.com

Migrations de sources de données multiples à l'aide de Flyway dans une application Spring Boot

Nous utilisons Flyway pour la migration de base de données dans notre application basée sur Spring Boot et nous avons maintenant l'obligation d'introduire une prise en charge multi-locataire tout en utilisant une stratégie de sources de données multiples. Dans ce cadre, nous devons également prendre en charge la migration de plusieurs sources de données. Toutes les sources de données doivent conserver la même structure, de sorte que les mêmes scripts de migration doivent être utilisés pour la migration de toutes les sources de données. En outre, les migrations devraient se produire au démarrage de l'application (par opposition au temps de génération, alors qu'il semble que le plugin maven puisse être configuré pour migrer plusieurs sources de données). Quelle est la meilleure approche à utiliser pour y parvenir? L'application a déjà défini des beans de source de données, mais Flyway exécute la migration uniquement pour la source de données principale.

16
Eli Avzak

Flyway prend en charge les migrations codées dans Java et vous pouvez donc démarrer Flyway lors du démarrage de votre application.

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

Je ne sais pas comment vous configureriez Flyway pour cibler un certain nombre de sources de données via ses fichiers de configuration. Mon propre développement est basé sur l'utilisation de Java pour appeler Flyway une fois par source de données sur laquelle je dois travailler. Spring Boot prend en charge le câblage automatique des beans marqués comme @FlywayDataSource, mais je n'ai pas cherché à savoir comment cela pourrait être utilisé.

Pour une solution en Java, le code peut être aussi simple que

    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

Pour que @Roger Thomas réponde davantage à la manière de Spring Boot:

La solution la plus simple consiste à annoter votre source de données principale avec @Primary (ce que vous avez déjà fait) et laissez simplement bootstrap migrer votre source de données principale de la manière "normale").

Pour les autres sources de données, migrez ces sources à la main:

@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
Jacob van Lingen

Ayant votre même problème ... J'ai examiné le spring-boot-autoconfigure artefact pour V 2.2.4 dans le org.springframework.boot.autoconfigure.flyway package et j'ai trouvé une annotation FlywayDataSource.

Annoter N'IMPORTE QUELLE source de données que vous souhaitez utiliser par Flyway devrait faire l'affaire.
Quelque chose comme ça:

@FlywayDataSource
@Bean(name = "someDatasource")
public DataSource someDatasource(...) {
        <build and return your datasource>
}
2
RobMcZag