MyBatis引起的线程池线程打满问题排查过程

spring boot maven打包jar包太大,怎么办?这个方法解决你的烦恼 在springboot maven项目中,有两种打包方式,一种是war包,一种是jar,今天我们讲一下jar的打包方式。但是在jar包打包只要我们发现,我们的项目jar太大了,每次上传到服务器的时候非常的慢,接下来我们就来解决一下这个问题,让jar包也能先war包一样,不用每次都上传那么大的jar。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.cn/post/

7152379508354449439


背景

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

outside_default.png
发现异常线程

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

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

outside_default.png
MyBatis拼接大SQL耗费性能

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

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

8b2afac89c16abbbc80d8f581cb0ef02.png

已在知识星球更新源码解析如下:

9a250661a71b4f1e6a8da55ba8f89912.jpeg

9e8d9ee12cb8afc238c3f1277e6232bb.jpeg

818f45db4c8b1430324181af83b77b47.jpeg

d0998b237b9481d3d426391eda5ab6b1.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Maven使Jar包缩小上百分倍的方法详解 maven打包在实际部署的时候是一个非常头疼的事情,jar太大导致上传时间很慢,今天我们就来出一个优化jar的好方法。分布式项目我们一般会采用Maven管理,整体架构分为三部分:三方依赖:通过pom.xml文件配置,添加到项目中来特点:变化小,占用空间大静态资源:特点:变化适中,占用空间大;不过一般的静态资源都另外管理,很少会直接放在项目里面业务代码:特点:变化大,占用空间小整个项目打包会被构建成一个Jar包,其中三方依赖也会被构建进去,占用空间最大的也是这个pom.xml文件,也就是大家通常说的。... 阅读详情

相关推荐

springboot整合druid 监控sql

springboot整合druid 监控sql 包括去除广告教程

一名代码爱好者的博客 1593

晒一晒程序员桌面,你惊呆了没?

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

芋艿V 866

MyBatis分页插件ThreadLocal污染问题解析

分页查询是数据库操作的常见需求,MyBatis通过PageHelper插件实现动态分页功能。其核心原理是利用ThreadLocal存储分页参数,通过拦截器机制自动修改SQL语句。这种设计虽然便捷,但在线程复用的场景下可能导致参数污染,出现分页异常。典型的故障现象包括查询结果集意外截断、分页参数错乱等。通过分析ThreadLocal的工作原理和线程池机制,可以定位到分页参数未及时清理的问题根源。解决方案包括手动清理线程变量、采用AOP切面保障清理执行,或改造为更安全的分页实现方式。这类问题在Web应用、微服务

weixin_34211761的博客 536

MyBatis连接数太多报错问题:message from server:“Too many connections“

话不多说,直接干货! 第一步: 在navicat里面使用命令: show variables like '%max_connections%'; 此处是我已经修改好了以后才显示1500,如果未设置默认是100,因此一般线上服务都需要修改此配置 第二步: 继续执行: set persist max_connections=1500; 由此即可修改成功.但千万不能漏了第三步!!! 第三步: 去对应的mysql部署的服务器查看mysql的端口号 紧接着就是重启mysql,即...

weixin_46816552的博客 1510

ThreadLocal内存泄漏深度解析:从弱引用到线程池排查

在Java并发编程中,引用类型与JVM内存回收机制是理解对象生命周期的基石。弱引用与强引用的差异,决定了对象何时能被GC回收,也直接影响着线程局部变量的安全性。ThreadLocal作为线程隔离的常用工具,其底层ThreadLocalMap中Entry的key采用弱引用、value却为强引用,当外部强引用断开后,value仍可能被线程持有,形成内存泄漏隐患。理解这一原理,不仅能解释为何单纯依赖弱引用无法根除问题,更能指导我们在线程池复用、高并发请求等场景下正确使用remove清理,并借助jmap、MAT等工

weixin_34354945的博客 349

MyBatis-Plus saveBatch异步事务问题分析与解决方案

在Java开发中,MyBatis-Plus作为流行的ORM框架,其saveBatch方法常用于批量数据操作。批量操作的核心原理是通过事务保证数据一致性,而Spring框架的事务管理基于ThreadLocal实现。当在异步环境下使用@Async注解时,由于线程切换会导致事务上下文丢失,进而引发数据不一致问题。本文通过电商订单系统的实际案例,剖析了MyBatis-Plus批量插入与Spring事务的交互机制,提出了编程式事务管理、调整传播行为等多种解决方案,并分享了线程池配置、性能优化等工程实践建议,帮助开发者

weixin_34128839的博客 565

记一次mybatis-plus自动填充失效暴露出的ThreadLocal与线程池问题:TaoToken统一Key下的排查复盘

mybatis-plus 自动填充在异步线程池中偶发失效,根因是 ThreadLocal 不跨线程、线程池复用串值。本文复盘用 TransmittableThreadLocal 加 TtlExecutors 包装线程池的完整修复方案,并借助 TaoToken 统一 Key 管理异步链路凭证,附可复制配置与验证步骤。详见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_35755640的博客 10

最新整理Java面试必问多线程+Spring Boot+Spring Cloud+Mybatis

最新整理Java面试必问多线程+Spring Boot+Spring Cloud+Mybatis 前言; 之前跟大家分享了JVM与性能优化+Redis+Dubbo+分布式的面试题,今天继续一起手撕面试官多线程+Spring Boot+Spring Cloud+Mybatis面试题分享给大家 答案文末领取哦 多线程 常用的几种线程池并讲讲其中的工作原理。 线程池启动线...

Javazhoumou的博客 928

系统卡顿排查指南:从死锁到线程池问题的实战诊断

在并发编程和分布式系统中,进程或线程的阻塞是常见的性能瓶颈。理解其背后的状态机原理,如Java线程的BLOCKED、WAITING等状态,是诊断问题的关键。通过分析线程转储和系统资源,可以定位死锁、锁竞争等核心问题。这些技术对于保障系统稳定性和高可用性至关重要,尤其在微服务和数据库操作等场景中。本文聚焦于实战中的线程池任务堆积和数据库连接泄漏等典型卡顿场景,提供了一套标准化的排查路径和工具链使用方法。

weixin_33911824的博客 335

Java 21虚拟线程实战:告别线程池与回调地狱,高并发IO的同步革命

在高并发IO场景中,传统线程池因平台线程资源昂贵而面临并发度与开销的权衡,异步回调与Reactor模式虽提升吞吐却带来回调地狱与心智负担。Java 21引入的虚拟线程,作为一种由JVM调度的轻量级线程,让开发者能以同步阻塞的编码方式获得接近异步的高并发能力。其核心原理是当虚拟线程执行阻塞IO时,载体线程可被释放并被调度其他任务,从而在用户态实现极低成本的线程切换。这一机制既保留了同步代码的可读性与调试便利,又使IO密集型应用能够低成本迁移,甚至通过一行配置即可让Spring Boot服务获得显著吞吐提升。从

weixin_31412781的博客 231

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

最近在使用Qt Design Studio进行开发,但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库),要不就只搜得到一点营销号不知道从哪里搬来的账号,鉴于Qt Design Studio是一个这么强大的软件,自然是需要来进行一下小小的实践的。所以开了这篇文章,方便没有使用过Qt Design Studio 和 QML的开发者也可以快速上手QDS(Qt Design Studio)。在本文中,你将学会如何使用QDS开发一个简单的QML程序,与你的C++后端代码进行交流。

Andius的博客 8215

后端服务故障排查 -- dubbo服务超时、线程池耗尽 CPU高负载

文章目录 问题现象 dubbo线程池耗尽的异常日志 cpu占用情况 问题排查 dubbo线程池耗尽排查 cpu 高负载排查 排查相关命令 排查 初步定位问题场景 验证,确认问题点 原因分析 调整后验证 其他执行的一些优化点 参考资料 问题现象 5-6 到 5-7,某测试环境我们的服务时常收到调用方反馈,d...

吒哇 2943

标准工时精益化管理:理论、方法与技巧

ECRS工时分析软件是一款综合性软件,包含了IE软件、IE改善软件、工业工程软件、作业改善/业务改善软件、动作分析软件、作业分析软件、ECRS分析法、ECRS改善手法、时间测量软件、工时测量软件、标准工时计算软件等功能。理论上,标准工时是指在标准的工作环境下,完成一道加工工序所需要花费的人工时间。不同企业、不同工序需要的辅助作业时间和损耗时间各不相同,因此企业需要灵活运用标准工时公式进行计算。总之,标准工时的制定需要综合考虑多种因素,企业可以灵活运用本文介绍的方法和技巧来优化制定流程。

VIOOVI_ECRS的博客 848

Tongweb假死排查:JNDI锁阻塞与线程池队列引发的应用无响应

在Java应用服务器中,线程池的阻塞队列选择直接影响故障表现:无界队列会让请求无限排队,使应用陷入“有请求无响应”的假死状态。而JNDI作为统一资源注册中心,其lookup操作被设计为低频管理动作,一旦被置于高频业务路径且内部锁竞争加剧,就可能成为系统瓶颈。当网络线程池全部阻塞在JNDI锁上,后端连接池又被慢SQL占满时,应用就会呈现“转圈”现象。通过jstack抓取线程dump,可以精准定位锁持有链,从源头解决问题。以一次Tongweb环境下的生产事故为线索,完整展示了从现象、原理、排查到优化的过程,为中

weixin_29268637的博客 203

从智能手机到汽车电子:聊聊IPC-9702/9704A标准如何帮我们搞定不同场景下的PCB可靠性设计

本文探讨了IPC-9702/9704A标准在智能手机和汽车电子等不同场景下的PCB可靠性设计应用。通过分析消费电子、汽车电子和工业设备中的应力特征,详细解读了IPC标准在应变识别和测试方法论中的核心价值,并提供了具体的轻量化设计策略和全生命周期验证方案,帮助工程师提升PCB的长期可靠性。

weixin_30693683的博客 280

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2632

​今天来复盘一个由PageHelper引起的多线程复用问题的排查和解决过程。让人难以相信的是,最终定位的原因竟然是,一个同事注释无用代码的时候少注释的一行导致的。不禁让木木熊和一起排查问题的同事

规范ThreadLocal的使用,使用完后一定要进行remove;PageHelper.startPage后一定要紧跟对应的查询逻辑对于常见的技术,不能仅仅停留在使用层面,一定要深入理解其使用原理。不然就会出现本文描述的,仅仅是少注释了一行无用代码,却对系统产生了重大的影响对于偶发性问题,需要考虑是否由线程安全和线程复用引起对于不需要的代码,直接删掉就行,不建议通过注释来隐藏,代码记录在git提交记录中都能找到。

2403_89464395的博客 751

ARM功耗管理之功耗状态及功耗模式

思考:功耗状态?功耗模式?Core&Cluster&Device&SoC如何映射?

AI-安全-功耗 785

多线程环境下导致MySQL死锁问题的分析与解决

在高并发场景下,设计数据库表时应充分考虑索引、事务隔离级别等因素。定期进行SQL审查与优化,减少潜在的性能瓶颈。推荐学习《高性能MySQL》书籍,深入了解MySQL优化的最佳实践。

weixin_43228360的博客 524

【人工智能】RAG如何根据实际需求选择和进行文档解析(如 PDF、Word、TXT、网页等)?

文档解析的核心在于根据解析目标、文档类型和处理量选择合适工具。PDF、Word、TXT和网页各有特性:PDF需区分可编辑与扫描版,Word需处理结构化内容,TXT简单但需注意编码,网页需应对动态内容。解析场景包括提取纯文本、结构化数据、保留格式和批量处理。非技术用户可借助工具如Adobe Acrobat、WPS和在线OCR,技术用户可通过编程实现自动化。通用流程为:明确目标、分析文档属性、选择工具并测试优化。核心是“工具适配需求”,无需追求万能方案。

奶爸的编程之路,也就一周冷个三天 509

2026年国赛C题微网与外部电网电力调控策略 (三):问题三、问题四滚动预测、实时电价与结果核验

专栏内定期更新ABCDE五题详细思路、代码(含运行结果图)和讲解视频-(11号之前半价):问题三看起来只是多给了一个光伏预报附件,实质上它改变了整道题的信息结构:问题四则是在问题二、问题三之上替换价格来源。问题4-2相当于“确定性计划+实时电价”,问题4-3相当于“滚动预测+实时电价”。物理模型完全不变,改变的是价格序列和费用口径。本文先给出核心结果:从结果看,问题3比问题2多约164.21万元,问题4-3比问题4-2多约168.79万元。主要增量不是“储能没有工作”,而是预测误差、计划偏差和紧急购电造成的

YOLO 345

极限压测3小时:P7考官与应届生对谈JVM调优,现场复现线程池死锁

在高并发压测的第3小时,系统突然遭遇线程池死锁问题,P7技术面试官与应届生深入探讨JVM调优策略。应届生现场使用Arthas诊断生产问题,发现死锁根源,并通过调整线程池参数和优化任务调度机制,成功化解危机。P7考官全程紧盯FullGC日志和线程堆栈,最终达成共识,完成面试考核。

Ared 880

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3913

解决 PageHelper 中 ThreadLocal 引发分页残留问题

Aspect@Component这样,AOP 会在方法执行后自动清理分页上下文。PageHelper 的分页残留问题主要源于的使用不当。每次分页查询后显式调用清理上下文。使用 AOP 或其他工具自动清理分页参数。在多线程场景下,确保分页上下文不会污染线程池。升级到最新版本的 PageHelper。通过合理使用这些方法,可以有效规避分页残留问题,提高系统的稳定性和可靠性。

qq_56694800的博客 1259

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ThreadLocal内存泄漏原因与避免方法:从弱引用到线程池的完整解析

在并发编程中,ThreadLocal 常被用来实现线程隔离,其核心机制是将数据绑定到当前线程的生命周期。但若使用不当,尤其是与线程池结合时,容易引发内存泄漏和脏数据问题。这背后的原理在于 ThreadLocalMap 的 Entry 结构:key 持有弱引用以允许 ThreadLocal 实例被回收,而 value 则是强引用,若线程长期存活且不主动清理,引用链就会阻断 value 的回收。理解这个不对称设计,是掌握内存泄漏根因的前提。通过 try-finally 调用 remove、规范声明 static

weixin_34293246的博客 1487

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

一个线程罢工的诡异事件

之前和crossoverJie一起排查了一个线上问题,他将其总结了一下,这里我做下转发。这个问题其实是因为一些编码的规范和对一些新的框架的不熟悉造成的,整个排查过程大家可...

lizhao007 147

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 面试八股文~
下一篇: 这16个有用的 SpringBoot 扩展接口,居然还有人不知道?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值