同事写了一条 SQL,把 MyBatis 都干翻了。。

这篇具有很好参考价值的文章主要介绍了同事写了一条 SQL,把 MyBatis 都干翻了。。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:Lxlxxx
链接:https://juejin.cn/post/7221461552343072828

前言

继上次线上CPU出现了报警,这次服务又开始整活了,风平浪静了没几天,看生产日志服务的运行的时候,频繁的出现OutOfMemoryError,就是我们俗称的OOM,这可还行!

频繁的OOM直接会造成服务处于一个不可用的情况,通过Skywalking查看链路调用,基本全报红了,基本处于一个瘫痪状态,因为生产该服务是分布式部署,运维当即立断对该服务进行重启,因为是B端的产品,先让公司业务能用起来了,保证服务的正常使用,然后紧急查看问题,当然这个问题就来到了我这里,既然分配给我了,咱高低给它查出来,并且修复了。

OutOfMemoryError出现的原因

先来了解下OutOfMemoryError出现的原因,无非就是两类堆内存空间不足、元空间不足

  1. 堆内存空间不足:意味着程序存在一直有引用的对象(强引用),主要对象在引用的状态就无法被GC回收,撑爆了-Xmx堆拓展的最大值,内存不足自然就会触发堆内存溢出。
  2. 元空间:Java 8引入了元空间概念,代替了之前堆的永久代,由于元空间属于堆外内存,不需要有对象引用,通过指针的方式表示类和元数据,之所以引用元空间就是一种JDK的升级优化,避免了永久代的内存溢出。

常见堆内存溢出的几种情况

  1. 查询数据库返回的数据量过大,加载到内存中导致内存溢出;
  2. 代码中出现死循环情况,导致大对象一直被引用不能被GC回收;
  3. 资源链接池、io流在使用完没有进行手动释放;
  4. 静态集合类里面存在引用对象,始终存在引用关系,没有进行清除;

以上属于常见的几种堆内存溢出的场景,当然有时候我们的遇到的问题都是稀奇古怪的问题,常见的问题总是很少能遇到…

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

现象分析

根据生产环境的报错日志来看,这边属于Mybatis报出的一个内存溢出情况,通过去看Mybatis源码发现,底层也是通过一些集合类来存放拼接的sql,那么当然也有可能出现堆内存溢出,而且在sql体积比较大的情况下,接收sql的集合就会变的非常大,如果回收不了那么就会导致内存溢出。

同事写了一条 SQL,把 MyBatis 都干翻了。。

由于我们docker容器里面没有一些jstack、jmap的工具,并且dump文件也没有进行保存…导致我无法通过看线程高占用内存的对象,来分析具体是什么操作发生的内存溢出,这就难了… 于是只能去网上搜搜看了,没想到真的给到我一些启发,并且有点思路大概知道是哪里的问题。

文章来源于zzzzbw作者写一篇关于 惨遭DruidDataSource和Mybatis暗算,导致OOM ,很感谢🙏这位作者给我带来的启发。 文章作者也遇到了Mybatis带来的OOM,主要是因为Mybatis拼接SQL的时候生成的占位符和参数对象,存放在Map里,当SQL的参数多导致SQL太长的时候,Map持有这些SQL时间较长,并且多线程同时操作,这时候内存占用就很高,从而发生OOM

Mybatis源码分析

通过对DynamicContext类源码查看,DynamicContext又一个ContextMap 类型的参数bindings,继承了HashMap相当于一个Map集合,接着看这个类中的getBindings方法,看到了ForEachSqlNode这类调用了getBindings方法,简单的说就是ForEachSqlNode通过getBindings方法,将SQL参数和参数的占位符统一put到ContextMap这个集合里面,主要是这里面的参数和占位符无法被GC回收,并发查询量多的情况下就会导致OOM。

同事写了一条 SQL,把 MyBatis 都干翻了。。

同事写了一条 SQL,把 MyBatis 都干翻了。。

同事写了一条 SQL,把 MyBatis 都干翻了。。

情景复现

随后我做了线上场景的复现,通过将SQL语句的拼接,将IN里面的参数变大,然后创建50个线程进行执行,将JVM堆内存设为-Xmx256m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError

同事写了一条 SQL,把 MyBatis 都干翻了。。

同事写了一条 SQL,把 MyBatis 都干翻了。。

这里看控制台打印的日志,服务在频繁的进行Full GC,导致OOM。

同事写了一条 SQL,把 MyBatis 都干翻了。。

总结

既然发现了问题出现的原因,接下来就是对代码SQL进行优化,尽量避免在sql拼接的时候体积过大,这里告诫我们代码不能乱写,SQL语句也不能随意写啊,有时候把问题想的过于简单确实会带来不可预知的风险。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-748853.html

到了这里,关于同事写了一条 SQL,把 MyBatis 都干翻了。。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我用chatgpt写了一篇关于2023 it 行业的发展的论文……

    我用chatgpt写了一篇关于2023 it 行业的发展的论文。我将从以下几个方面来探讨2023年IT行业的发展: 1.云计算技术在IT行业的应用:随着云计算技术的发展,2023年IT行业将受益于云计算技术在数据存储、计算能力和安全性方面的优势。 2.大数据技术在IT行业的应用:大数据技术的

    2024年02月07日
    浏览(51)
  • 花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)

    有了ChatGPT之后,于我来说,有两个十分明显的变化: 1. 人变的更懒 因为生活、工作中遇到大大小小的事情,都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天,甚至更久才能写一篇原创内容,现在有了主题、框架之后,ChatGPT 30分钟就能给我一篇「水准之上」

    2024年02月07日
    浏览(57)
  • vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

    近期在开发可视化大屏项目,除去各种 echarts 图表和地图展示之外还有多个表格。现在来了一个需求,需要将大屏中的所有表格设置为内容无缝滚动。 本着程序员的七宗罪原则第一时间推脱了一下,但没推脱成功。 简单的在网上查了下适合我们项目的有两种方案,第一种是

    2024年02月09日
    浏览(49)
  • 解决elementUI固定列后,下方多了一条横线的问题

    最近遇到一个bug,如下图,el-table的操作列使用fixed属性固定后,下方多了一条横线: 我们将样式设置高优先,以覆盖内联样式,如下是less里使用穿透样式解决的办法:

    2024年02月22日
    浏览(43)
  • oppo手机便签隐藏了一条怎样打开?手机如何找到隐藏便签?

    有不少用户在使用OPPO手机的过程中,遇到了一些问题,例如自己在使用手机系统便签应用时,把一条重要的便签设置了隐藏,但是现在找不到隐藏的便签了。 那么oppo手机便签隐藏了一条怎样打开?OPPO手机如何找到隐藏便签?其实当你为单条便签设置了隐藏之后,是可以在便

    2024年01月22日
    浏览(46)
  • 可以,很6!微信这波改造,一刀斩断了一条“灰色”业务线。

    你好呀,我是歪歪。 微信官方今天“悄悄咪咪”的搞了一个小动作,而这个小动作我关注了接*两个月时间,今天终于是上线了。 对微信来说,这也许就是一个小迭代。 这个迭代对于用户来说,算是一个利好的动作,体现了微信订阅号“以用户为中心”的指导思想。但是对于

    2024年02月03日
    浏览(29)
  • 好失落!用心地发了一条朋友圈,结果却没人关注

    01 在这个社交媒体盛行的时代,朋友圈已经成为了人们展示自己生活的重要途径。 不知道你有没有这样的经历:很用心地编辑了一条朋友圈动态,满怀期待地想看到别人的点赞、关心和夸赞,结果发出去了很久,都没有人点赞和评论,然而,当这些期望没有得到满足时,内心

    2024年02月03日
    浏览(37)
  • 揭秘!我用AI写了一部精彩小说;搭建AI视频创作工作流;一键生成摘要工具清单;大模型创业生死5问 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 作者团队梳理了自2018年以来大语言模型的发展历程,并可视化成了这棵树的生长过程。对于模型的学习和选择,都非常有参考意义。 GIF高清动图 和 JPG高清图有点大,放在咱们的知识星球里了,

    2024年02月10日
    浏览(53)
  • 10 种超好用的 MyBatis 写法,同事都说好用!

    MyBatis 虽说给我们的开发带来了很多的便捷,但有些地方写起来依旧比较的麻烦,比如配置XML的时候,但是一个好的写法,不仅能为我们节省不少时间、还能能降低出错的概率,下面就给大家分享一些优质的写法: foreach元素的属性主要有item,index,collection,open,separator,

    2024年02月01日
    浏览(30)
  • 我写了一套uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) 实战课程,免费分享给CSDN的朋友们

    大家好,我是锋哥,最近写了一套前后端分离的uniapp微信小程序投票系统,逼格略高,专门为Java初学者提升技术层次和方便就业而精心打造。希望你们喜欢! (文末领取) 本课程采用主流的技术栈实现,小程序端采用用Uni-app技术,Mysql数据库,SpringBoot2+Mybatis Plus后端,red

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包