Mybatis PageHelper编译SQL引发的一次性能问题.18286262

news/2024/10/6 4:26:46/文章来源:https://www.cnblogs.com/lilpig/p/18286380

起源

最近一直在跟大佬们做公司项目的性能优化,我这种小卡乐咪基本上负责的就是慢接口优化,但实际上只有以下几种情况需要进行接口代码级别的改造:

  1. 循环查库、RPC
  2. 数据库设计不合理
  3. 业务流程太长,代码耦合性太高等

随着对接口分析的深入,我们越来越发现系统中有很多拖后腿的问题是与业务代码无关的,今天要分享的这个是关于MyBatis大名鼎鼎的第三方分页插件PageHelper在生成count语句时,若语句参数数量过大导致的性能问题。

初步发现问题

在对慢接口进行日志分析的时候,我们发现一些count语句日志的打印较上一行隔了很久,而从代码上来看,到上一行日志打印后,这中间没有做什么耗时操作。

img

一番排查后,我们发现这种慢的语句具有如下特性:

  1. 都是来自于分页查询中自动生成的count
  2. 都具有大量的参数(示例中是7000+个)

简单排查

虽然我们很怀疑这7000多个参数,这2000ms会不会花在网络IO或数据库查询上了,毕竟这种大量in的几乎都是全表查询,但冷静下来想一想,根据MyBatis打印SQL的一贯套路,可以推断出这个耗时肯定不是count语句实际执行产生的IO耗时或网络等待,因为在打印这行语句时SQL应该还没有执行。

插一嘴:由于我们表的数据量并不大,几十万级别,并且有覆盖in查询条件的索引可以利用,这大大减少了要扫描的页面数量,实际count语句执行只需要几十ms

在执行到该位置时观察CPU,当时几乎是单核心跑满的,所以当时一定在做一些CPU操作。

至此,已经开始怀疑是语句参数数量过大导致的SQL编译大量耗费CPU,但又考虑到一个现代的CPU不可能被这种简单的任务难住,于是决定jstack抓一下当时CPU究竟在干什么:

img

从堆栈上看,CPU当时肯定是在编译SQL没跑了,本地运行代码Debug到PageHelper中,也发现最终在getSmartCountSql中调用jSqlParser.parse来生成分页SQL时耗费了1到2s:

img

count之后,Mybatis自己也要编译这个具有大量in参数的SQL,而它只花了6ms,至此已经可以完全断定是PageHelper的性能问题了。

img

这种纯CPU的性能问题是不可扩展的,若你有一个四核心的CPU,CPU处理的总能力肯定只能在2s钟内执行完4个编译任务,假设有80个并发,这个编译时间只会越来越长。

官方issue中有两个人反馈了这个问题,但官方貌似持摆烂态度2

替换策略

联系大佬移除底层脚手架中的PageHelper,使用MyBatis内部的分页插件,性能回归正常

img

猜想

由于PageHelper内部使用的JSqlParser实现是CCJSqlParser,其是C语言实现的,怀疑是不是在参数量大时需要在native堆栈和JVM堆栈中大量传递数据导致的呢?目前不了解JNI,这个不敢妄下结论了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙音箱App设计总结

前言 最近做了一个关于带Sound bar的智能电视的蓝牙项目,就是将电视Sound bar当作蓝牙音箱,将手机、电脑等设备的声音传输到电视,通过电视Soundbar播放声音。做这个项目的时候遇到了各种大大小小的问题,好在都解决了。本篇文章总结了在设计蓝牙相关的项目时需要了解的小知识…

设计模式学习(二)工厂模式——抽象工厂模式

介绍抽象工厂模式,并说明其优缺点目录背景抽象工厂模式优点与缺点 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此我们要创建两个类去封装这两个不同平台下的API。…

aippt 实现原理 AI生成PPT开源项目

AI生成PPT原理与代码实现通过 AI 生成 PPT 火了好长一段时间了,该类型产品也越来越多,我分析了几个主流的 aippt 产品,其中有一家公司的技术原理让我眼前一亮:文多多 AI 生成 PPT,官网: https://docmee.cn 该产品在 github 上有对应开源项目:https://github.com/veasion…

自定义流程表单开发优势体现在什么地方?

一起来了解自自定义流程表单开发的优势特点。提质、增效、降本,应该是很多职场办公需要实现的发展目标。那么,应用什么样的软件平台可以实现?低代码技术平台、自定义流程表单开发是目前流行于职场行业中的软件产品,可视化操作界面、够灵活、易维护等优势特点明显,在推进企…

Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV,Stochastic Volatility) 模型|附代码数据

全文下载链接:http://tecdat.cn/?p=16708 最近我们被客户要求撰写关于随机波动率的研究报告,包括一些图形和统计输出。 波动率是一个重要的概念,在金融和交易中有许多应用。它是期权定价的基础。波动率还可以让您确定资产配置并计算投资组合的风险价值 (VaR) 甚至波动率本身…

2024.7.5 鲜花

菜就多练空白とカタルシス——TOGENASHI TOGEARI。震惊,K某He 强推竟然是这首歌,三天重复上百遍…… どれだけ手に入れても どれだけ自分のものにしてもしてもしても 追いつけないな 高望みしすぎなんて 腐ったような言葉 誰しも誰よりも優れて欲しくはないんだよ 理由はただ…

泛娱乐出海新风口,视频云技术需要怎样的融合创新?

泛娱乐的音视频技术随着出海在演进,交互和内容的技术是内核,也在融合。 泛娱乐的音视频技术随着出海在演进,交互和内容的技术是内核,也在融合。 面向出海,虽然娱乐社交这个行业由来已久,但近几年的商业模式发生了巨大变化,比如行业刚兴起时,大家要先把DAU做大之后再…

米尔瑞米派集聚5种操作系统,兼顾学习开发和项目产品需要的派

米尔电子发布的瑞萨第一款MPU生态板卡-瑞米派(Remi Pi),采用瑞萨RZ/G2L双核A55芯片,接口丰富,全面兼容树莓派的扩展模块。瑞米派支持五种系统,兼顾学习开发和项目产品需要。软件提供五种软件系统分别为:基于Yocto构建的两种系统,一种是支持通用功能的精简型系统,另一种…

echarts中Label标签与数据项颜色设置为同一种颜色

echarts5中默认标签颜色不会跟数据项颜色保持一致,而是全都是黑色。想要实现label颜色和它的数据项颜色一致,需要手动继承颜色,设置label{ color: inherit}即可解决label标签颜色与数据项颜色一致。 https://echarts.apache.org/examples/zh/editor.html?c=pie-simple 注意…

GaussDB AI新特性:gs_index_advise推荐索引

GaussDB的AI新特性,可以把SQL文本嵌套在函数中,数据库会返回一个创建合适索引的列gs_index_advise(text) 描述:针对单条查询语句推荐索引。 参数: SQL语句字符串 返回值类型: record 一、通常的SQL优化会通过参数调优的方式进行调整,例如如下参数set enable_fast_query_s…

Packing Python to exe(打包Python成EXE文件)

Python文件要执行需要Python环境,如果package成EXE文件则可以随意放在任意主机上去执行。package步骤如下: 1. 安装pythoninstaller (pip install pyinstaller) 2.安装auto-py-to-exe(有UI界面,很方便使用)(pip install auto-py-to-exe) 3.然后直接运行命令auto-py-to-e…

Sqlalchemy 连接SQL Server 登录失败

实验系统环境 Windows平台 Sqlalchemy 2.0.23 Python 3.10 SQL Server 2012 aioodbc 0.5.0 问题详情 sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) (28000, [28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]登录失败。该登录名来自不受信任的域,不…