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

简介: 本文简单介绍了ruoyi系统以及flyway数据库版本控制技术。并说明了如何在ruiyi中集成flyway组件。重点阐述了集成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

packagecom.hngtghy.framework.config;
importjavax.annotation.PostConstruct;
importjavax.sql.DataSource;
importorg.flywaydb.core.Flyway;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.Configuration;
@ConfigurationpublicclassFlywayConfig {
@AutowiredprivateDataSourcedataSource;
// 字符编码@Value("${flyway.encoding}")
privateStringencoding;
// 对执行迁移时基准版本的描述@Value("${flyway.baseline-description}")
privateStringbaselineDescription;
// 是否自动执行基准迁移@Value("${flyway.baseline-on-migrate}")
privatebooleanbaselineOnMigrate;
// 指定 baseline 的版本号@Value("${flyway.baseline-version}")
privateStringbaselineVersion;
// 迁移时是否校验@Value("${flyway.validate-on-migrate}")
privatebooleanvalidateOnMigrate;
// 是否允许无序的迁移@Value("${flyway.out-of-order}")
privatebooleanoutOfOrder;
// 当读取元数据表时是否忽略错误的迁移@Value("${flyway.ignore-future-migrations}")
privatebooleanignoreFutureMigrations;
// 当初始化好连接时要执行的SQL@Value("${flyway.init-sql}")
privateStringinitSql;
@PostConstructpublicvoidmigrate() {
Flywayflyway=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目录下定义初始脚本,如下图:

image.png

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

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

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

image.png

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

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

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

二、解决flyway集成报错方法

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

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

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

@Service@DependsOn("flywayConfig")
publicclassConfigServiceImplimplementsIConfigService

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

image.png

image.png

总结:

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

目录
相关文章
|
4月前
|
运维 Kubernetes Nacos
nacos常见问题之集成nacos时 端口9848报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
4月前
|
SQL 分布式计算 DataWorks
DataWorks报错问题之集成hive数据源报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
4月前
|
Java Nacos Docker
在集成nacos时,端口9848报错但服务器的这个端口是开放的
在集成nacos时,端口9848报错但服务器的这个端口是开放的【1月更文挑战第14天】【1月更文挑战第67篇】
1089 1
|
4月前
|
SQL DataWorks 关系型数据库
DataWorks数据源问题之数据集成报错如何解决
DataWorks数据源是指DataWorks中配置的用于数据集成的外部数据源;本合集将讲解如何在DataWorks中配置和管理数据源,以及处理数据源连接和集成过程中的问题。
|
4月前
|
SQL DataWorks NoSQL
DataWorks数据源问题之数据集成任务报错如何解决
DataWorks数据源是指DataWorks中配置的用于数据集成的外部数据源;本合集将讲解如何在DataWorks中配置和管理数据源,以及处理数据源连接和集成过程中的问题。
|
2月前
|
DataWorks API 数据库
DataWorks操作报错合集之在使用 OceanBase (OB) 作为数据源进行数据集成时遇到报错,该如何排查
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
弹性计算 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之集成sls时出现报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
26天前
|
Java Spring
【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found
【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found
|
2月前
|
Serverless 语音技术 开发工具
函数计算操作报错合集之怎么何集成nls tts python sdk
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
3月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在数据集成到MySQL时,遇到特殊字符导致的脏数据如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。