Java Spring Boot Flyway将数据库迁移应用到错误的数据库
我正在尝试配置Spring Boot和Flyway,以便使用Spring Boot 2.2.6和Flyway 5.2.3对两个不同的数据源应用单独的迁移 主要数据源: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
@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