Java慢查询优化记录

问题描述

打开页面后加载数据需要三秒,数据量不大。影响用户体验需要优化

问题定位

使用阿里开源的 arthas 工具,通过trace命令追踪查询的controller方法

  1. 安装arthas

  2. 安装包命令下打开cmd,执行java -jar arthas-boot.jar命令,输入对应的java进程的序号,启动arthas

  3. cmd继续输入命令 或者 直接打开http://127.0.0.1:8563/ 页面进入控制台输入追踪命令:trace [类路径] [方法名] ,对方法进行追踪

  4. 触发对应的查询方法,可以看到方法耗时,找到耗时最长的方法继续追踪

    最后追踪到mapper方法,count次数29次,占比98%,在整个方法中占比约70%

    注:追踪为本地环境,与线上环境存在差异,故耗时不一致

  5. 查看对应的方法com.ruoyi.base.service.impl.GcProjectEntityServiceImpl.queryPredecessorTasks()

    确认为在递归中执行数据库查询导致

解决方案

重构方法,将数据库查询方法抽取出来。减少数据库查询次数。

结果

代码上传,程序发布后,耗时下降至57.81毫秒

服务器上追踪了下,耗时61.59毫秒,提升大约 98% 的效率

避免类似问题

团队中宣导尽量不要在递归中执行数据库查询