0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:稀土掘金 作者:树洞君 2022-10-17 16:24 次阅读

背景

我们有个业务服务长期没有进行过上线,但是服务器监控经常会发生报警,提示 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 过高的都是哪些线程

b970de72-4dc0-11ed-a3b6-dac502259ad0.jpg

发现异常线程

排查就会发现 mybatis 执行的相关线程。

4、于是我们根据提示找到相应的源码处进行分析。mybatis 组装 sql 语句这里,这段代码,在 sql 很长的并且入参很多说的时候,下面对 sql 的拼接,将#{属性名}替换成?是很耗费 cpu 的。

b98368ee-4dc0-11ed-a3b6-dac502259ad0.jpg

MyBatis拼接大SQL耗费性能

5、那么导致这个问题的原因是什么呢?我们针对 mapper 里的 sql 语句发现,有个查询条件入参是个 list,mapper 是这么写:

b9ac1a28-4dc0-11ed-a3b6-dac502259ad0.jpg

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 配置,建议不要往大了改!






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2970

    浏览量

    104814
  • SQL
    SQL
    +关注

    关注

    1

    文章

    766

    浏览量

    44164
  • RBAC
    +关注

    关注

    0

    文章

    44

    浏览量

    9973

原文标题:MyBatis引起的线程池线程打满问题排查过程

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    跨平台的线程组件--TP组件

    /销毁代价是很高的。那么我们要怎么设计多线程编程???答案:对于长驻的线程,我们可以创建独立的线程
    的头像 发表于 04-06 15:39 881次阅读

    Java中的线程包括哪些

    线程是用来统一管理线程的,在 Java 中创建和销毁线程都是一件消耗资源的事情,线程可以重复
    的头像 发表于 10-11 15:33 823次阅读
    Java中的<b class='flag-5'>线程</b><b class='flag-5'>池</b>包括哪些

    为什么会有线程怎样操作线程

    信号是什么?信号是如何产生的?为什么会有线程怎样操作线程
    发表于 12-23 07:27

    线程是如何实现的

    线程的概念是什么?线程是如何实现的?
    发表于 02-28 06:20

    基于线程威廉希尔官方网站 集群接入点的应用研究

    本文在深入研究高级线程威廉希尔官方网站 的基础上,分析、研究了固定线程数目的线程线程数目动态变化的
    发表于 01-22 14:21 5次下载

    基于Nacos的简单动态化线程实现

    本文以Nacos作为服务配置中心,以修改线程核心线程数、最大线程数为例,实现一个简单的动态化线程
    发表于 01-06 14:14 868次阅读

    线程线程

    线程通常用于服务器应用程序。 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理
    的头像 发表于 02-28 09:53 803次阅读
    多<b class='flag-5'>线程</b>之<b class='flag-5'>线程</b><b class='flag-5'>池</b>

    Java线程核心原理

    看过Java线程源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,
    的头像 发表于 04-21 10:24 867次阅读

    如何用C++实现一个线程

    C++线程是一种多线程管理模型,把线程分成任务执行和线程调度两部分。
    发表于 06-08 14:53 1790次阅读
    如何用C++实现一个<b class='flag-5'>线程</b><b class='flag-5'>池</b><b class='flag-5'>呢</b>?

    线程线程怎么释放

    线程分组看,pool名开头线程占616条,而且waiting状态也是616条,这个点就非常可疑了,我断定就是这个pool开头线程导致的问题。我们先排查为何这个
    发表于 07-31 10:49 2306次阅读
    <b class='flag-5'>线程</b><b class='flag-5'>池</b>的<b class='flag-5'>线程</b>怎么释放

    Spring 的线程应用

    我们在日常开发中,经常跟多线程打交道,Spring 为我们提供了一个线程方便我们开发,它就是 ThreadPoolTaskExecutor ,接下来我们就来聊聊 Spring 的线程
    的头像 发表于 10-13 10:47 626次阅读
    Spring 的<b class='flag-5'>线程</b><b class='flag-5'>池</b>应用

    线程基本概念与原理

    一、线程基本概念与原理 1.1 线程概念及优势 C++线程简介
    的头像 发表于 11-10 10:24 542次阅读

    线程的基本概念

    ? 呃呃,我这么问就很奇怪,因为线程是什么我都没说,怎么会知道为什么会有线程?所以我打算带大家去思考一个场景: 当我们的程序中:有一批
    的头像 发表于 11-10 16:37 530次阅读
    <b class='flag-5'>线程</b><b class='flag-5'>池</b>的基本概念

    线程的创建方式有几种

    线程是一种用于管理和调度线程的威廉希尔官方网站 ,能够有效地提高系统的性能和资源利用率。它通过预先创建一组线程并维护一个工作队列,将任务提交给线程
    的头像 发表于 12-04 16:52 880次阅读

    什么是动态线程?动态线程的简单实现思路

    因此,动态可监控线程一种针对以上痛点开发的线程管理工具。主要可实现功能有:提供对 Spring 应用内线程
    的头像 发表于 02-28 10:42 651次阅读