背景
springboot 数据库脚本手动维护、线上手动初始化,对于项目部署、以及多环境部署多版本程序迭代都有问题。flyway正好解决此问题。但是,在spingboot项目集成中有加载顺序问题,导致程序启动异常,比如在程序中在得到bean 对象,进行程序的业务逻辑处理,但flyway并没有进行初始化导致失败。
解决办法(mysql版本)
- pom
-
<!-- flyway --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency>
-
- 代码
-
package com.ahys; import lombok.extern.slf4j.Slf4j; import org.flywaydb.core.Flyway; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; @Slf4j @Order(Ordered.HIGHEST_PRECEDENCE) public class FlywayInitializerTest implements ApplicationContextInitializer { @SneakyThrows @Override public void initialize(ConfigurableApplicationContext applicationContext) { log.info("FlywayInitializer start ..."); log.info("FlywayInitializer start ..."); long start = System.currentTimeMillis(); ConfigurableEnvironment environment = applicationContext.getEnvironment(); String url = environment.getProperty("spring.datasource.url"); String username = environment.getProperty("spring.datasource.username"); String password = environment.getProperty("spring.datasource.password"); String initDbSql = environment.getProperty("initDbSql"); createDbIfNotExist(url,username,password,initDbSql); Flyway flyway = Flyway.configure().dataSource(url, username, password).load(); flyway.baseline(); flyway.migrate(); log.info("FlywayInitializer wasteTime {} ms",System.currentTimeMillis()-start); } private void createDbIfNotExist(String url,String userName,String password,String initDbSql) throws Exception { Assert.notNull(initDbSql,"初始化dbSql不能为空."); log.info("createDbIfNotExist sql {}",initDbSql); String url01 = url.substring(0,url.lastIndexOf("/")); log.info("url01 {}",url01); Connection connection = DriverManager.getConnection(url01, userName, password);; Statement statement = connection.createStatement(); // 创建数据库 statement.executeUpdate(initDbSql); statement.close(); }
-
- apllication.yml 配置文件
-
context: initializer: classes: com.ahys.FlywayInitializerTest spring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
-