likes
comments
collection
share

mybatis引起的线程池线程打满问题排查过程-踩坑集锦 30(一周一更 补上周)

作者站长头像
站长
· 阅读数 24

背景

我们有个业务服务长期没有进行过上线,但是服务器监控经常会发生报警,提示cpu使用率100%影响线上生产,偶发的现象所以一开始没注意,后续经过排查才发现原来是踩中了一个“坑”

排查过程

1、首先排除了新业务上线的问题

2、其次通过服务器的监控排除了硬件故障的问题

3、于是使用java线程分析工具,分析了导致cpu过高的都是哪些线程

mybatis引起的线程池线程打满问题排查过程-踩坑集锦 30(一周一更 补上周) 排查就会发现mybatis执行的相关线程。

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

mybatis引起的线程池线程打满问题排查过程-踩坑集锦 30(一周一更 补上周)

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

mybatis引起的线程池线程打满问题排查过程-踩坑集锦 30(一周一更 补上周)

6、为了验证问题,我们自己做了一个测试,通过入参条件的调整,来进行执行时间的监控验证,最后经过反复的测试发现当入参list的数量达到10万级别的时候,cpu就飙升到了120%,执行了29s,是造成线程等待的元凶

总结

在使用list做mapper入参,一定要考虑上限

转载自:https://juejin.cn/post/7152379508354449439
评论
请登录