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

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

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

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

一、flyway在ruoyi框架中的集成

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

<!-- 数据库版本控制核心依赖 -->
<dependency>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-core</artifactId>
</dependency>

​​

<!-- 数据库版本控制插件 -->
<plugin>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-maven-plugin</artifactId>
</plugin>

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

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

3、定义flyway配置bean

package com.hngtghy.framework.config;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;

import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FlywayConfig {

  @Autowired
  private DataSource dataSource;
  
  // 字符编码
  @Value("${flyway.encoding}")
  private String encoding;
  
  // 对执行迁移时基准版本的描述
  @Value("${flyway.baseline-description}")
  private String baselineDescription;

  // 是否自动执行基准迁移
  @Value("${flyway.baseline-on-migrate}")
  private boolean baselineOnMigrate;

  // 指定 baseline 的版本号
  @Value("${flyway.baseline-version}")
  private String baselineVersion;

  // 迁移时是否校验
  @Value("${flyway.validate-on-migrate}")
  private boolean validateOnMigrate;
  
  // 是否允许无序的迁移
  @Value("${flyway.out-of-order}")
  private boolean outOfOrder;
  
  // 当读取元数据表时是否忽略错误的迁移
  @Value("${flyway.ignore-future-migrations}")
  private boolean ignoreFutureMigrations;
  
  // 当初始化好连接时要执行的SQL
  @Value("${flyway.init-sql}")
  private String initSql;
  
  @PostConstruct
  public void migrate() {
    Flyway flyway = Flyway.configure()
    		.dataSource(dataSource)
    		.encoding(encoding)
    		.baselineDescription(baselineDescription)
    		.baselineOnMigrate(baselineOnMigrate)
    		.baselineVersion(baselineVersion)
    		.validateOnMigrate(validateOnMigrate)
    		.outOfOrder(outOfOrder)
    		.ignoreFutureMigrations(ignoreFutureMigrations)
    		.initSql(initSql)
    		.load();
    flyway.migrate();
  }

}

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

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

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

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

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

   /**
     * 项目启动时,初始化参数到缓存
     */
    @PostConstruct
    public void init()
    {
        loadingConfigCache();
    }

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

二、解决flyway集成报错方法

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

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

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

@Service
@DependsOn("flywayConfig")
public class ConfigServiceImpl implements IConfigService

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

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

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜郎king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值