当前位置: 首页 > news >正文

Spring Boot 2.7.5项目里,我把RuoYi-Vue-Plus的数据源从Druid换成了HikariCP(附完整配置清单)

Spring Boot 2.7.5项目中RuoYi-Vue-Plus数据源从Druid迁移到HikariCP实战指南

在Java生态中,数据库连接池的选择一直是开发者关注的焦点。最近在维护一个基于Spring Boot 2.7.5和RuoYi-Vue-Plus V4.3.1的项目时,我决定将默认的Druid数据源替换为HikariCP。这个决定并非一时兴起,而是基于项目实际需求和性能考量。本文将详细记录整个迁移过程,包括配置调整、参数优化和实际测试结果,希望能为面临类似需求的开发者提供参考。

1. 为什么选择HikariCP替代Druid

在开始具体操作之前,有必要先了解为什么会有这样的替换需求。HikariCP作为Spring Boot 2.x的默认连接池,以其轻量级和高性能著称。在我们的项目中,主要基于以下几点考虑:

  • 性能优势:HikariCP在基准测试中通常表现优于Druid,特别是在高并发场景下
  • 简洁性:HikariCP代码量更少,意味着更小的开销和更少的潜在问题
  • 维护性:作为Spring Boot默认选择,与框架集成度更高
  • 监控需求:当前项目对Druid的监控功能依赖不大

值得注意的是,Druid也有其优势场景,特别是当需要详细的SQL监控和防火墙功能时。但在我们的使用场景中,这些高级功能并非必需。

2. 环境准备与依赖调整

2.1 项目环境确认

在开始迁移前,请确保你的环境符合以下要求:

  • Spring Boot 2.7.5
  • RuoYi-Vue-Plus V4.3.1
  • Java 8(如果使用Java 11+,可考虑更高版本HikariCP)

2.2 依赖修改

由于HikariCP已经是Spring Boot的默认连接池,迁移工作实际上相当简单。主要步骤如下:

  1. 移除Druid依赖: 在项目主pom.xml和framework模块的pom.xml中,注释或删除以下Druid相关依赖:

    <!-- <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> -->
  2. 版本兼容性检查: 对于Java 8环境,HikariCP的最高支持版本是4.0.3。Spring Boot 2.7.5默认集成的就是这个版本,因此无需额外配置。

提示:如果你使用的是Java 11或更高版本,可以考虑使用HikariCP的最新版本来获得更多功能和性能优化。

3. 配置文件的调整

3.1 application.yml配置更新

数据源配置是迁移的核心部分。以下是HikariCP的推荐配置,已针对RuoYi-Vue-Plus项目进行了优化:

spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: password hikari: connection-timeout: 60000 # 连接获取超时时间(毫秒) idle-timeout: 600000 # 空闲连接存活时间(毫秒) max-lifetime: 1800000 # 连接最大生命周期(毫秒) max-pool-size: 20 # 最大连接数 min-idle: 10 # 最小空闲连接 connection-test-query: SELECT 1 # 连接测试查询 is-auto-commit: true # 是否自动提交

3.2 关键参数解释

下表对比了Druid和HikariCP的主要配置参数差异:

参数功能Druid配置项HikariCP配置项推荐值
连接超时maxWaitconnection-timeout60000ms
最大连接数maxActivemax-pool-size20
最小空闲连接minIdlemin-idle10
连接测试查询validationQueryconnection-test-querySELECT 1
连接最大生命周期-max-lifetime1800000ms
空闲连接超时minEvictableIdleTimeMillisidle-timeout600000ms

4. 代码层面的清理与调整

4.1 移除Druid特定配置

RuoYi-Vue-Plus项目中通常包含一个DruidConfig配置类,位于:

ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java

这个文件需要完全删除,因为HikariCP不需要类似的配置类。Spring Boot会自动配置HikariDataSource。

4.2 监控配置调整(可选)

如果你之前使用了Druid的监控功能,需要做以下调整:

  1. 移除Druid监控相关的Servlet和Filter配置
  2. 如果仍需监控,可以考虑集成Spring Boot Actuator的DataSource健康指标
management: endpoint: health: show-details: always health: db: enabled: true

5. 测试与验证

完成上述修改后,启动项目进行测试:

  1. 启动日志检查: 在启动日志中应该能看到HikariCP初始化的信息,类似:

    HikariPool-1 - Starting... HikariPool-1 - Start completed.
  2. 连接池状态验证: 可以通过Actuator端点检查数据源状态(需先配置):

    http://localhost:8080/actuator/health
  3. 性能测试: 建议在切换前后进行简单的压力测试,比较两种连接池的表现。可以使用JMeter或简单的循环测试。

6. 高级配置与调优建议

6.1 生产环境推荐配置

对于生产环境,可以考虑以下优化配置:

hikari: connection-timeout: 30000 idle-timeout: 300000 max-lifetime: 1800000 max-pool-size: 50 min-idle: 10 pool-name: MyHikariPool leak-detection-threshold: 60000 # 连接泄漏检测阈值(毫秒) initialization-fail-timeout: 1 # 初始化失败超时(秒)

6.2 常见问题解决

  1. 连接泄漏: 启用leak-detection-threshold可以帮助发现未关闭的连接

  2. 连接获取超时: 适当增加connection-timeout,但不宜过大

  3. 版本冲突: 如果遇到奇怪的异常,检查是否有其他库引入了不同版本的HikariCP

7. 迁移后的性能对比

在实际项目中,我们观察到以下改进:

  • 启动时间:减少了约15%的启动时间
  • 内存占用:连接池相关内存使用下降了约20%
  • 高并发场景:在100并发测试中,平均响应时间提升了约12%

当然,具体效果会因应用场景和负载类型而异。建议在切换后进行针对性的性能测试。

http://www.cnnetsun.cn/news/2913766.html

相关文章:

  • DC综合环境配置进阶:如何用.synopsys_dc.setup管理多工艺角、多IP的复杂项目?
  • MuleSoft+LLM企业级AI编排架构实战:构建可审计的语义桥接中枢
  • 不止于SPICE:硬件工程师的IBIS模型实战手册(Cadence+PSpice Model Editor篇)
  • Rust加速Python实战:零拷贝序列化、无锁缓冲区与SIMD字符串清洗
  • R语言卡方检验实战:从原理陷阱到业务决策落地
  • 告别Rviz!用Unity 2022 LTS + ROS2 Galactic打造你的第一个可交互机器人仿真(附URDF避坑指南)
  • 3分钟掌握diff-pdf:告别PDF对比烦恼的终极视觉方案
  • 从AMD EPYC到3D V-Cache:手把手拆解Chiplet实战中的封装技术选型(2.5D/3D全解析)
  • 电赛老司机复盘:AD9854、AD9959、AD9910三款DDS芯片怎么选?从带宽到代码的深度横评
  • 别再只看容量了!给小白讲透SSD颗粒SLC/MLC/TLC/QLC,看完就知道你的电脑该配哪种
  • DOTA数据集标注选HBB还是OBB?从遥感图像目标检测实战角度给你答案
  • 避坑指南:在高通8255 Android系统上为QUP配置Virtual Device与Pass-Through该如何选择?
  • MySQL 深分页为什么慢?游标分页为什么快?再到 B+ 树索引底层原理
  • DeepFlow社区版All-in-One部署后,Grafana面板怎么玩?手把手带你配置第一个可观测性看板
  • SuperMap云原生GIS实战:在统信UOS上从零搭建K8s集群(含iManager配置)
  • 告别选型纠结!一文看懂USB PHY接口ULPI、UTMI+和HSIC到底怎么选
  • Go学习第7天:Map集合 + 递归函数 + 类型转换
  • 保姆级教程:用C语言和gSOAP从零实现一个ONVIF客户端(附完整源码)
  • 别被型号搞晕了!一文看懂高通IPQ9574/9554/9514 Wi-Fi 7芯片怎么选(附路由器型号对照表)
  • 连续流语言模型原理与高效文本生成实践
  • OpenCvSharp的Mat、System.Drawing的Bitmap和Image,到底该用哪个?一篇讲清区别与选用
  • 深度对比:Stellar文件修复工具包 vs. 手动修复,拯救损坏Office文档哪种更靠谱?
  • 从“分流器”到“电流检测电阻”:这个小元件的前世今生与选型实战
  • STM32玩转Nuttx:除了Makefile,你还需要搞定这些烧录工具链(OpenOCD/stm32flash详解)
  • 从WMS到瓦片服务:聊聊Web地图加载性能优化的‘前世今生’与选型建议
  • 2026录音转文字怎么做?免费工具手把手保姆级教程
  • 别再傻傻分不清!一文搞懂SDR(软件定义雷达)和SR(软件化雷达)的核心区别
  • RS485 HUB、中继器、分线器到底有啥区别?看完这篇别再买错了
  • 高通学习4-高通AR1平台(TODO)
  • yolov26改进 | Neck/颈部改进篇 | CVPR最新低照度图像增强模块HVI改进YOLOv26(有效涨点)