package com.battery.business.runtime;
|
|
import javax.sql.DataSource;
|
|
import com.alibaba.druid.pool.DruidDataSource;
|
import org.flywaydb.core.Flyway;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
|
/**
|
* 使用主数据源的连接参数建立独立 JDBC 连接,在业务数据源就绪前执行版本化迁移。
|
*
|
* <p>项目使用自定义 Druid 数据源,因此不使用 Spring Boot 默认 Flyway 自动装配。</p>
|
*/
|
@Configuration
|
public class FlywayMigrationConfig
|
{
|
@Bean(name = "flywayMigrationInitializer", initMethod = "migrate")
|
public FlywayMigrationInitializer flywayMigrationInitializer(@Qualifier("masterDataSource") DataSource dataSource)
|
{
|
if (!(dataSource instanceof DruidDataSource druidDataSource))
|
{
|
throw new IllegalStateException("Flyway requires the configured Druid master datasource");
|
}
|
Flyway flyway = Flyway.configure()
|
// Flyway 直接使用连接参数,避免 MySQL 拒绝可选的 performance_schema 探测后
|
// Druid 将池内连接标记为不可用。
|
.dataSource(druidDataSource.getUrl(), druidDataSource.getUsername(), druidDataSource.getPassword())
|
// 旧迁移链仅作历史保留,新库从最终业务基线初始化。
|
.locations("classpath:db/migration-final")
|
.baselineOnMigrate(false)
|
.validateOnMigrate(true)
|
.outOfOrder(false)
|
.cleanDisabled(true)
|
.load();
|
return new FlywayMigrationInitializer(flyway);
|
}
|
|
/** 通过独立生命周期 Bean 显式执行迁移,便于验证启动顺序。 */
|
public static final class FlywayMigrationInitializer
|
{
|
private final Flyway flyway;
|
|
public FlywayMigrationInitializer(Flyway flyway)
|
{
|
this.flyway = flyway;
|
}
|
|
public void migrate()
|
{
|
flyway.migrate();
|
}
|
}
|
}
|