怎样去解决MyBatis引起的线程池线程打满问题呢

背景
我们有个业务服务长期没有进行过上线,但是服务器监控经常会发生报警,提示 cpu 使用率 100% 影响线上生产。偶发的现象,所以一开始没注意,后续经过排查才发现原来是踩中了一个“坑”。
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
排查过程
1、首先排除了新业务上线的问题
2、其次通过服务器的监控排除了硬件故障的问题
3、于是使用 java 线程分析工具,分析了导致 cpu 过高的都是哪些线程
发现异常线程
排查就会发现 mybatis 执行的相关线程。
4、于是我们根据提示找到相应的源码处进行分析。mybatis 组装 sql 语句这里,这段代码,在 sql 很长的并且入参很多说的时候,下面对 sql 的拼接,将#{属性名}替换成?是很耗费 cpu 的。
mybatis拼接大sql耗费性能
5、那么导致这个问题的原因是什么呢?我们针对 mapper 里的 sql 语句发现,有个查询条件入参是个 list,mapper 是这么写:
foreach
6、为了验证问题,我们自己做了一个测试,通过入参条件的调整,来进行执行时间的监控验证,最后经过反复的测试发现「当入参 list 的数量达到 10 万级别的时候,cpu 就飙升到了 120%,执行了 29s,是造成线程等待的元凶」
基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://gitee.com/zhijiantianya/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
总结
「在使用 list 做 mapper 入参,一定要考虑上限」
另外,sql 的 in 里面的数据也太多了吧,sql 太长超过 max_allow_packet 会报错的。这个 mysql 配置,建议不要往大了改!


基于DSP技术的数字频率计设计方案
明纬模块电源产品线NMP系列
iphone竟然败了,诺基亚4100万像素秒杀苹果
基于FPGA技术实现FFShark方案
ABB推出全新AFC接触器,高安全性适用于多种复杂环境
怎样去解决MyBatis引起的线程池线程打满问题呢
号称世界上最小最轻的5号电池充电器
荣耀Note9什么时候上市?华为荣耀Note9大曝光:全面屏+大电池+麒麟960,价格3000起不服来战
简述手机板对板连接器发展趋势及测试方案
为何半导体整并中资身影频频现身?
精灵宝可梦Go国内还是不能玩,魅族手机去年卖了2200万台
华为发布《广域网络服务化白皮书》,业界首次提出广域网络服务化理念
台积电2020年的营收预计将达到454.2亿美元
更新漏洞会拖慢电脑速度?究竟有多严重?
骨传导耳机哪个品牌比较好、骨传导耳机性价比推荐
什么样的蓝牙耳机好?2022性价比超高的蓝牙耳机
我国5G基站总数达328.2万个
利尔达携手智能企业助力智慧校园建设,数据能力加持
神经网络与“老式AI”结合,MIT和IBM联合解决深度学习痛点
超级电容器充电的说明,充电原理是怎样的