FlywayConfig.java 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package com.genersoft.iot.vmp.conf;
  2. import org.flywaydb.core.Flyway;
  3. import org.flywaydb.core.api.FlywayException;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Configuration;
  8. import javax.annotation.PostConstruct;
  9. import javax.sql.DataSource;
  10. /**
  11. * 数据库自动升级脚本
  12. */
  13. @Configuration
  14. public class FlywayConfig {
  15. private final static Logger logger = LoggerFactory.getLogger(FlywayConfig.class);
  16. @Autowired
  17. private DataSource dataSource;
  18. @Autowired
  19. private UserSetting userSetting;
  20. @PostConstruct
  21. public void migrate() {
  22. if (!userSetting.getSyncDb()) {
  23. logger.info("[数据库自动升级] 已关闭");
  24. return;
  25. }
  26. Flyway flyway = Flyway.configure()
  27. .dataSource(dataSource)
  28. .locations("db/migration")//sql文件名称规则:"V20210625.17.30__V1.0.sql"
  29. // 自动创建flyway元数据表标识
  30. .baselineOnMigrate(true)
  31. .baselineVersion("0")
  32. // 禁止flyway执行清理
  33. .cleanDisabled(true)
  34. .table("flyway_schema_history_wvp")
  35. // 对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply,
  36. // 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件;
  37. // 而生产环境应该设置 spring.flyway.outOfOrder=false
  38. .outOfOrder(true)
  39. .encoding("UTF-8")
  40. .load();
  41. try {
  42. flyway.migrate();
  43. } catch (FlywayException e) {
  44. logger.error("[数据库自动升级]配置第一次加载出错", e);
  45. try {
  46. flyway.repair();//生成版本记录表
  47. logger.info("[数据库自动升级]配置修复成功");
  48. flyway.migrate();
  49. logger.info("[数据库自动升级]配置重新加载成功");
  50. } catch (Exception e1) {
  51. logger.error("[数据库自动升级]配置第二次加载出错", e1);
  52. throw e1;
  53. }
  54. }
  55. }
  56. }