• Ruoyi集成flyway后启动报错的解决方法


    ruoyi系列框架是开源中非常好的源码平台,使用宽松的开源协议进行源代码的开放。不管是单体版、前后端分离甚至是微服务架构,均提供了相应的代码。基于ruoyi可以做自己的后台系统,也可以学习很多技术的集成。

    而flyway是java里面的数据库脚本自动管理工具,使用flyway可以在应用程序升级时自动管理sql脚本,从而避免用户忘记而带来的没有执行脚本引起的问题。是多版本开发中非常好用的sql版本管理组件。

    官方的ruoyi框架并没有集成flyway,在开源生态中是有一些爱好者自己基于ruoyi来进行集成。本文将简单分享基于ruoyi单体版(其它版本类同)如何集成flyway,在集成的过程中会遇到什么问题,同时分享三种解决方案。

    一、flyway在ruoyi框架中的集成

    1、在ruoyi的pom.xml中定义flyway依赖,具体代码如下所示:

    1. <dependency>
    2. <groupId>org.flywaydbgroupId>
    3. <artifactId>flyway-coreartifactId>
    4. dependency>

    ​​

    1. <plugin>
    2. <groupId>org.flywaydbgroupId>
    3. <artifactId>flyway-maven-pluginartifactId>
    4. plugin>

    2、系统配置文件application.yml定义flyway相关配置

    1. flyway:
    2. # 字符编码
    3. encoding: utf-8
    4. # 对执行迁移时基准版本的描述
    5. baseline-description: BaseLineInitialize
    6. # 若连接的数据库非空库,是否初始化
    7. # 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    8. baseline-on-migrate: true
    9. # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略
    10. # 开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
    11. baseline-version: 1.0.0
    12. # 是否开启校验
    13. # 迁移时是否校验,默认为 true
    14. validate-on-migrate: true
    15. # 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder
    16. # 是否允许无序的迁移,默认 false
    17. out-of-order: true
    18. # 当读取元数据表时是否忽略错误的迁移,默认false
    19. ignore-future-migrations: false
    20. # 当初始化好连接时要执行的SQL
    21. init-sql: SELECT * FROM pg_tables WHERE tablename NOT LIKE'pg%' AND tablename NOT LIKE'sql_%' ORDER BY tablename;

    3、定义flyway配置bean

    1. package com.hngtghy.framework.config;
    2. import javax.annotation.PostConstruct;
    3. import javax.sql.DataSource;
    4. import org.flywaydb.core.Flyway;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.context.annotation.Configuration;
    8. @Configuration
    9. public class FlywayConfig {
    10. @Autowired
    11. private DataSource dataSource;
    12. // 字符编码
    13. @Value("${flyway.encoding}")
    14. private String encoding;
    15. // 对执行迁移时基准版本的描述
    16. @Value("${flyway.baseline-description}")
    17. private String baselineDescription;
    18. // 是否自动执行基准迁移
    19. @Value("${flyway.baseline-on-migrate}")
    20. private boolean baselineOnMigrate;
    21. // 指定 baseline 的版本号
    22. @Value("${flyway.baseline-version}")
    23. private String baselineVersion;
    24. // 迁移时是否校验
    25. @Value("${flyway.validate-on-migrate}")
    26. private boolean validateOnMigrate;
    27. // 是否允许无序的迁移
    28. @Value("${flyway.out-of-order}")
    29. private boolean outOfOrder;
    30. // 当读取元数据表时是否忽略错误的迁移
    31. @Value("${flyway.ignore-future-migrations}")
    32. private boolean ignoreFutureMigrations;
    33. // 当初始化好连接时要执行的SQL
    34. @Value("${flyway.init-sql}")
    35. private String initSql;
    36. @PostConstruct
    37. public void migrate() {
    38. Flyway flyway = Flyway.configure()
    39. .dataSource(dataSource)
    40. .encoding(encoding)
    41. .baselineDescription(baselineDescription)
    42. .baselineOnMigrate(baselineOnMigrate)
    43. .baselineVersion(baselineVersion)
    44. .validateOnMigrate(validateOnMigrate)
    45. .outOfOrder(outOfOrder)
    46. .ignoreFutureMigrations(ignoreFutureMigrations)
    47. .initSql(initSql)
    48. .load();
    49. flyway.migrate();
    50. }
    51. }

    4、最重要的千万不要忘记在resources目录下定义初始脚本,如下图:

    5、在启动main入口中记得写以下代码:

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,FlywayAutoConfiguration.class })

    通过以上步骤基本完成flyway框架的引入。通往成功的路上总是充满了拦路虎,这里也不例外,启动main方法,你会发现,系统报错了。

    遇到异常不要慌,因为慌解决不了问题。仔细查看日志,主要的错误原因是系统加载sys_config的信息时找不到表。为什么系统会在启动时加载呢?再往前找,找到在ConfigServiceImpl中定义一个类加载初始化方法:

    1. /**
    2. * 项目启动时,初始化参数到缓存
    3. */
    4. @PostConstruct
    5. public void init()
    6. {
    7. loadingConfigCache();
    8. }

    出现这个问题的原因就是这个引起的。因为在初始化时,会从数据库里查询表。而使用flyway后,数据库结构还未初始化,所以肯定是会报错的。解决思路就是,让flyway先启动,初始化数据库结构,再运行对应的参数到缓存中即可。下面分享三种方法解决这个问题。

    二、解决flyway集成报错方法

    1、针对应用规模不大的情况下,可以禁止在初始化时加载数据到缓存中。因为在实际访问时还会将数据加载到缓存中,因此提速的作用也不是很明显。这种解决方法比较简单。将涉及到@PostConstruct初始加载的bean都注释掉。

    2、如果想要在应用系统启动后还是可以有初始缓存怎么办呢?也是可以的。具体方法可以参见一个博主的文章,这种方式也可以很好的解决。博文地址:https://www.easck.com/cos/2021/0626/619426.shtml ,本文不再赘述。

    3、在springboot中使用@DependsOn注解来设置flyway启动顺序。设置了这个注解的类,必须要前置类初始化后才能开始启动。这样就很好的避免了异常。具体代码示例如下:​​​​​​​

    1. @Service
    2. @DependsOn("flywayConfig")
    3. public class ConfigServiceImpl implements IConfigService

    通过以上配置就可以完成flyway的集成,并成功启动应用。

    总结:本文简单介绍了ruoyi系统以及flyway数据库版本控制技术。并说明了如何在ruiyi中集成flyway组件。重点阐述了集成flyway的过程中会遇到的问题以及针对这个问题的三种不同的解决方案。

  • 相关阅读:
    PTA天梯赛训练 7-8 查验身份证 (15分)
    【数据结构】排序(1)
    程 控 电 源1761程控模块电源
    SECS/GEM300协议通讯平台
    高薪程序员&面试题精讲系列126之消息队列中积压了一百多万条消息怎么办?如何保证消息的一致性?
    python中numpy数组形状和计算
    在ubuntu上安装ns2和nam(ubuntu16.04)
    深度学习基础——残差神经网络(ResNet)
    最新!基于Open3D的点云处理入门与实战教程
    微服务的发展历程的详细说明及每个阶段主流的架构和组件
  • 原文地址:https://blog.csdn.net/yelangkingwuzuhu/article/details/125992732