springboot flyway集成方式(加载顺序问题)

背景

springboot 数据库脚本手动维护、线上手动初始化,对于项目部署、以及多环境部署多版本程序迭代都有问题。flyway正好解决此问题。但是,在spingboot项目集成中有加载顺序问题,导致程序启动异常,比如在程序中在得到bean 对象,进行程序的业务逻辑处理,但flyway并没有进行初始化导致失败。

解决办法(mysql版本)

  1. pom 
    1. <!-- 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>

       

  2. 代码
    1. 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();
      
          }
      

       

  3. apllication.yml 配置文件
    1. context:
        initializer:
          classes: com.ahys.FlywayInitializerTest 
      
      spring:
        autoconfigure:
          exclude:
            - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration

       

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值