首页 > 其他分享 >Ruoyi集成flyway后启动报错的解决方法

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

时间:2024-06-13 17:34:01浏览次数:23  
标签:集成 初始化 Ruoyi private ruoyi 报错 Value 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的过程中会遇到的问题以及针对这个问题的三种不同的解决方案。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/yelangkingwuzuhu/article/details/125992732

标签:集成,初始化,Ruoyi,private,ruoyi,报错,Value,flyway
From: https://www.cnblogs.com/fswhq/p/18154575

相关文章

  • fasterxml ToStringSerializerBase报错
    ToStringSerializerBase报错报错内容整合dubbo时报错Causedby:java.lang.NoClassDefFoundError:com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase atcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule.<init>(JavaTimeModule.java:158)~[jackson-dataty......
  • requests 开启charles代理报错
    当前报错urllib3版本:1.26.7解决代理报错的几种方式:配置代理请求proxies={'http':'http://127.0.0.1:8888','https':'http://127.0.0.1:8888'}data=requests.post(url,json=body,headers=headers,verify=False,pr......
  • RuoYi: 企业级快速开发平台
    目录前言1项目介绍1.1简介1.2特性2技术选型3功能方面4代码解释4.1控制器层示例4.2服务层示例4.3数据访问层示例4推荐理由4.1高效开发4.2灵活性和扩展性4.3完善的功能和安全性4.4活跃的开源社区结语前言在现代企业级应用开发中,高效、稳定、安全的快......
  • Let's Encrypt续费证书异常报错解决
    Let'sEncrypt续费证书异常报错解决在续费免费证书时出现错误,这里小记一下。现象#certbotcertonly--webroot-w/usr/share/nginx/html-dgh.wqyfchina.comSavingdebuglogto/var/log/letsencrypt/letsencrypt.logRequestingacertificateforgh.wqyfchina.comCer......
  • Oracle报错:“Error in invoking target ‘agent nmhs’ of makefile...”
    Oracle报错:“Errorininvokingtarget‘agentnmhs’ofmakefile...”  前言:Oracle在安装过程中的报错一定要重视,这决定你后续是否能完成安装以及是否能使用。我这边会陆续汇总一些报错现象以及解决方案共享。##InstallProduct86%报错信息:“Errorininvokingtarget'......
  • SpringBoot 项目报 Flyway 错误
    报错信息ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.2024-06-1117:13:35.478ERROR22452---[main]o.s.boot.SpringApplication:Applicationrunfailedo......
  • 报错:ResizeObserver loop limit exceeded的处理方法(学习自用)
    报错:ResizeObserverlooplimitexceeded处理方法:在main.js添加://从elementui中引出TableimportElementUI,{Table}from'element-ui'//处理table宽度报错的问题constfixElTableErr=table=>{constoldResizeListener=table.methods.resizeListenertabl......
  • 【jmeter】ubuntu分布式jmeter报错:java.rmi.ConnectException: Connection refused to
    一、场景   由于高并发测试,服务器资源不够用,所以需要使用jmeter分布式进行测试,但是测试过程中报错:java.rmi.ConnectException:Connectionrefusedtohost:127.0.1.1;  二、问题原因   就是hostname-i如果返回的是127.0.1.1 三、处理方法   修改hostna......
  • nodejs下载依赖npm install报错
    npminstall报错,解决记录_npmwarnusing--forcerecommendedprotectionsdis-CSDN博客先切换镜像源,然后清理缓存,在使用npm命令注意前面可能爆粗哦的原因大概率是权限问题,所以采用这种解决方式加上面合体:解决:安装vueCLI不成功时,执行npmcleancache-force清除缓存命令无效_n......
  • Go版RuoYi
     RuoYi-Go  https://github.com/Kun-GitHub/RuoYi-Go1.关于我个人介绍2.介绍后端用Go写的RuoYi权限管理系统(功能正在持续实现)后端 Gitee地址3.前端RuoYi-Vue3官方前端Vue3版4.Go后端技术栈(持续在对齐项目,在补充)功能框架是否采用备注配置......