Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot Flyway将数据库迁移应用到错误的数据库_Java_Spring_Spring Boot_Flyway - Fatal编程技术网

Java Spring Boot Flyway将数据库迁移应用到错误的数据库

Java Spring Boot Flyway将数据库迁移应用到错误的数据库,java,spring,spring-boot,flyway,Java,Spring,Spring Boot,Flyway,我正在尝试配置Spring Boot和Flyway,以便使用Spring Boot 2.2.6和Flyway 5.2.3对两个不同的数据源应用单独的迁移 主要数据源: @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = {"com.gobsmack.*.repository.primary"}, entityManage

我正在尝试配置Spring Boot和Flyway,以便使用Spring Boot 2.2.6和Flyway 5.2.3对两个不同的数据源应用单独的迁移

主要数据源:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.gobsmack.*.repository.primary"},
                       entityManagerFactoryRef = "primaryEntityManagerFactory",
                       transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDatasourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.primary-datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(primaryDataSource())
                .packages("com.gobsmack.*.model")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager(
            final @Qualifier("primaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory) {
        return new JpaTransactionManager(primaryEntityManagerFactory.getObject());
    }
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.gobsmack.*.repository.secondary"},
                       entityManagerFactoryRef = "secondaryEntityManagerFactory",
                       transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDatasourceConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "spring.secondary-datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(secondaryDataSource())
                .packages("com.gobsmack.*.model")
                .build();
    }

    @Bean
    public PlatformTransactionManager secondaryTransactionManager(
            final @NonNull @Qualifier("secondaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory) {
        return new JpaTransactionManager(secondaryEntityManagerFactory.getObject());
    }
}
第二个数据源:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.gobsmack.*.repository.primary"},
                       entityManagerFactoryRef = "primaryEntityManagerFactory",
                       transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDatasourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.primary-datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(primaryDataSource())
                .packages("com.gobsmack.*.model")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager(
            final @Qualifier("primaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory) {
        return new JpaTransactionManager(primaryEntityManagerFactory.getObject());
    }
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.gobsmack.*.repository.secondary"},
                       entityManagerFactoryRef = "secondaryEntityManagerFactory",
                       transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDatasourceConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "spring.secondary-datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(secondaryDataSource())
                .packages("com.gobsmack.*.model")
                .build();
    }

    @Bean
    public PlatformTransactionManager secondaryTransactionManager(
            final @NonNull @Qualifier("secondaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory) {
        return new JpaTransactionManager(secondaryEntityManagerFactory.getObject());
    }
}
数据源连接属性:

spring:
  primary-datasource:
    jdbc-url: jdbc:mysql://localhost:3306/primary?useSSL=false&primary
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: username
  secondary-datasource:
    jdbc-url: jdbc:mysql://localhost:3306/secondary?useSSL=false&secondary
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: username
Flyway迁移:

@Slf4j
@Configuration
public class FlywayConfiguration {

    public static final String DB_MIGRATION_BASE = "db/migration/";

    private DataSource primaryDataSource;
    private DataSource secondaryDataSource;

    @Value("${spring.primary-datasource.jdbc-url:localhost}")
    private String primaryDatasourceUrl;

    @Value("${spring.secondary-datasource.jdbc-url:localhost}")
    private String secondaryDatasourceUrl;

    @Autowired
    public FlywayConfiguration(@Qualifier("primaryDataSource") DataSource primaryDataSource,
                               @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        this.primaryDataSource = primaryDataSource;
        this.secondaryDataSource = secondaryDataSource;
    }

    @PostConstruct
    public void migrate() {
        log.info("Preparing Flyway migration for database with url: " + primaryDatasourceUrl);
        migrateDatabase(primaryDataSource, "primary");

        log.info("Preparing Flyway migration for database with url: " + secondaryDatasourceUrl);
        migrateDatabase(secondaryDataSource, "secondary");
    }

    /**
     * Migrate specific database.
     * @param datasource The datasource.
     * @param directories The directories containing the migration scripts.
     */
    private void migrateDatabase(@NonNull DataSource datasource, @NonNull String... directories) {
        for (val directory : directories) {
            log.info("Migration scripts source: " + directory);
            new Flyway(Flyway.configure()
                             .dataSource(datasource)
                             .locations(DB_MIGRATION_BASE + directory))
                             .migrate();
        }
    }
}
目录结构:

迁移脚本
V1.0.0_1_uusecondary_uinit.sql
仅正确应用于
secondary
数据库

问题是
db/migration/primary
db/migration/secondary
中的脚本都应用于
primary
数据库,而只应用主目录中的脚本


如何将Flyway配置为仅将目录
db/migration/primary
中的迁移脚本应用于
primary
数据库?

我必须禁用正在查找脚本以应用于
@primary
注释数据库的Flyway的自动运行。它正在
db/migration
的子目录中查找所有迁移脚本

因此,在
application.yml
配置文件中,我必须添加:

spring:
  flyway:
    enabled: false

我不得不禁用正在查找脚本以应用于
@Primary
注释数据库的Flyway的自动运行。它正在
db/migration
的子目录中查找所有迁移脚本

因此,在
application.yml
配置文件中,我必须添加:

spring:
  flyway:
    enabled: false