mybatis使用流式查询避免一次性查询数据量过大导致OOM(内存溢出)

使用mybatis-plus流式查询解决文件导出出现oom的问题 MybatisPlus的流式查询功能为开发者在处理大数据量场景时提供了强大且高效的解决方案。通过合理设置流式查询参数,既能保证系统的内存利用率,又能确保数据处理的高效进行。掌握并善用流式查询,无疑将为您的项目开发增添一份有力保障。 阅读详情

问题

开发中难免会遇到大批量数据的导出,比如几十万(几百万)条数据,而服务器的内存过小则会导致内存溢出

解决方案

使用mybatis的流式查询,步骤如下:
dao层接口:

@Mapper
public interface CustomerDao {
 		List<BpmsCustomerManageFormalEntity> selectAll();
        List<BpmsCustomerManageFormalEntity> selectFetchSize2();
}

xml文件:

<!--普通查询-->
<select id="selectAll" resultType="com.ratel.streaming.entity.BpmsCustomerManageFormalEntity">
        SELECT * FROM bpms_customer_manage_formal
    </select>
    
    <!--流式查询-->
#这个是关键 其中fetchSize="-2147483648",Integer.MIN_VALUE=-2147483648
<select id="selectFetchSize2"  resultType="bpmsCustomerManageFormalEntity" fetchSize="-2147483648">
        SELECT * FROM bpms_customer_manage_formal
    </select>

本次数据库准备的数据量是40万条左右

结果

使用java自带的java内存监控工具jvisualvm.exe查看内存使用:
由图可知:普通查询的峰值使用内存为1500M ,而流式查询大约为1000M左右,大大节省了内存!
在这里插入图片描述

参考链接:

Mysql中使用流式查询避免数据量过大导致OOM
MySQL中流式查询使用
MyBatis中使用流式查询避免数据量过大导致OOM
Mybatis 3.4.0 Cursor的使用
正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
MyBatis中使用流式查询避免数据量过大导致OOM
关于oracle与mysql官方jdbc的一些区别

mybatis流式游标查询-导出DB大数据量查询OOM问题 Service层—需注意加上事务注解表示该service并不是在mapper结束时结束事务,而是等整个service结束才结束事务,不然会出现只能读取到第一段游标的结果集。客户端而言,数据每次读取都是从本机器的内核缓冲区,所以性能会更快一些,一般情况不必担心本机内核无数据消费(除非。服务端传递来的数据,在客户端不做任何业务逻辑,拿到数据直接放弃,会发生客户端消费比服务端超前的情况)流式查询,将结果集一条一条的拉取进内存,比较依赖网络,可能会造成网络阻塞。弊端就显而易见了,如果查询数据量过大,会不断经历。 阅读详情

相关推荐

Cadence17.2 > Allegro > 检查PCB Layout信号线组等长

Cadence17.2 > Allegro > 检查PCB Layout等长和配线

DL_62532的专栏 1万+

mybatis查询大批量数据

服务端数据准备完成后,进行数据传输,它允许应用程序在数据库服务器上打开一个游标并按需检索数据,而不是一次性获取整个结果集,类似客户端向服务端分批。公司里有很多需要跑批数据的场景,这些数据几十万到几千万不等,目前我们采用的是分页查询,但是分页查询有个深度分页问题,上百万的数据就会查询的很慢。客户端而言,数据每次读取都是从本机器的内核缓冲区,所以性能会更快一些。代表的客户端内核源源不断的输送数据,直到客户端请求 Socket 缓冲区满,这时的。问题,我们可以选择使用分页查询,这样就不会导致内存溢出问题了。

一零贰肆的博客 2118

ElasticSearch读写性能调优

深层次理解,虽然是每隔一秒就会将内存中的segment数据刷新到segment file中,但实际上这里并没有直接到磁盘文件,而是先写入到OS Cache中。以refresh_interval为间隔时间,将保存在ES 内存缓存区中的数据 刷新到 os的文件系统缓存中,定期清空es的buffer,生成segment。注意:ES 的默认设置,已经综合考虑了数据可靠性,搜索的实时性,写入速度,一般不要盲目修改。将segment刷新到os cache中,并开放了查询权限,以提升搜索的实时性。

qq_44027353的博客 1811

MyBatis Plus 解决大数据量查询慢问题

往期热门文章: 1、能挣钱的,开源SpringBoot和Vue的企业级项目,代码很规范! 2、Spring Batch 批量处理,骚气且强大! 3、IDEA新UI速览,成了VS Code的样子? 4、一个比传统数据库快 100-1000 倍的数据库 5、银行科技部半年!人间半个月!文章来源:https://blog.youkuaiyun.com/xhaimail/article/details/11938...

Java后端技术 1206

激光SLAM算法性能对比:在Ubuntu20.04上实测Point-LIO/FAST_LIO2/Faster-LIO的运行效果

本文在Ubuntu 20.04平台上对Point-LIO、FAST-LIO2和Faster-LIO三款激光SLAM算法进行了深度实测与性能对比。通过量化分析绝对轨迹误差、CPU/内存占用及单帧处理延迟等核心指标,结合室内外场景数据,为高精度测绘、服务机器人及自动驾驶等不同应用场景提供了清晰的选型指南和实战调优建议。

weixin_28335283的博客 368

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2152

数据库大数据(一次查询结果超过百万)量处理方法启用游标查询

数据库大数据量处理方法启用游标查询 1,可以防止数据库一下返回过大,超时(超过数据库限制),效果类似分页查询 2,需要开启事务---分批查询的缘故 @Transactional @Override public List<HHDto> getHNoPage(HRequest hRequest) { List<HH> result = new ArrayList<>(); List<HH> res...

yuhui666666的博客 5778

点云欧式聚类快速了解

一种基于欧氏距离度量的聚类算法基于KD-Tree的近邻查询算法是加速欧式聚类算法的重要预处理方法KD-Tree是由二分搜索树演变而来的用于大规模高维度数据查找场景当中的索引结构,主要用于最近邻查找和近似最近邻查找。将整个空间划分为二叉树的形式,方便有效找到最近邻点云处理算法库PCL,是比较重要的,在后续会继续学习,然后发出更优质的文章。

xiaobaiwsc的博客 1722

MyBatis中使用流式查询避免数据量过大导致OOM

今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap space 看下日志,是因为一次查询数据量过大导致JVM内存溢出了,虽然可以配置JVM大小,但是指标不治本,还是需要优化代码。网上查看大家都是流式查询,这里记录下解决的过程。 1、Mapper.xml配置 select语句需要增加fetchSize属性,底层是...

bobozai86的博客 5258

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 673

SAP-ABAP:SAP的BAPI_GOODSMVT_CREATE 深度解析

BAPI_GOODSMVT_CREATE 深度解析** **功能定位**:SAP 标准接口,支持 **11 种库存移动场景**(收货/发货/转储/生产投料等),是 MM 模块集成核心

baidu_35680696的博客 1827

myBatis-plus/myBatis 流式查询,解决大数据量查询慢而且内存溢出的异常

myBatis-plus/myBatis 流式查询,大数据量查询 myBatis 这个开源框架的好处就不再赘述,myBatis-plus 则更是myBatis的增强工具。 myBatis-plus/myBatis 给我们提供了很多方便查询方式, ...

sugarMessi的博客 2万+

ESP32 VSCode开发环境配置

ESP32 VSCode开发环境配置

qq_53529450的博客 510

大数据量查询大杀器之Mybatis 流式查询

流式查询 在我们查询大数据量数据,而内存不够的时候,我们常常使用的做法就是分页,分页的效率往往是低下的,当然如果表有自增id主键,基于自增id主键去查询效率也还行,但这不是我们今天介绍的重点,我们今天介绍的重点是Mybatis流式查询,也就是我们在查询数据的时候查询成功后返回的结果集不是一个集合而是一个迭代器,每次从迭代器中处理查询一条结果,这样就能避免大数据导致的OOM。 实战 MyBatis 流式查询的核心接口是 Cursor 可以看到 Cursor 继承了 Iterable接口。由Iterable知

念念不忘,必有回响 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mysql流式查询mybatis_Mybatis中使用流式查询避免数据量过大导致OOM

一、前言前面介绍了裸露JDBC 方式使用流式编程,下面介绍下MYbatis中两种使用流式查询方法二、Mybaits中MyBatisCursorItemReader的使用2.1 配置MyBatisCursorItemReader的注入value="com.taobao.accs.mass.petadata.dal.sqlmap.AccsDeviceInfoDAOMapper.selectByExam...

weixin_36143290的博客 1017

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

mybatis流式查询

数据库框架mybatis的流式查询知识点前言MyBatis 流式查询接口但构建 Cursor 的过程不简单方案一:SqlSessionFactory方案二:TransactionTemplate方案三:@Transactional 注解实战使用pom文件中的配置mapper.xml文件配置自定义ResultHandler来分批处理结果集ServiceImpl类中的使用总结深入了解MySQL的流式查询机制为什么要用流式查询?1、oracle等商业数据库的fetchsize2、流式查询与MySQL fetchs

qq_41134142的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Java-MyBatis】MyBatis 流式查询有什么用?

MyBatis流式查询是一种处理大数据量的高效方案,通过逐条获取数据避免内存溢出。其核心价值包括:内存优化(仅消耗单条数据内存)、响应加速(实现数据流水线处理)和资源节省(减少数据库连接占用)。典型应用场景包括数据导出、实时日志分析等大数据处理。使用时需注意连接管理、事务控制和性能平衡,建议1万以下数据用普通查询,1-50万用流式查询,超过50万采用分页批处理。流式查询本质是以时间换空间,适合大数据场景但需及时关闭游标防止资源泄漏。

ZGW0513的博客 2100

mysql mybatis oom_MyBatis中使用流式查询避免数据量过大导致OOM

一、前言前面介绍了裸露JDBC 方式使用流式编程,下面介绍下MYbatis中如何使用阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、Mybaits中MyBatisCursorItemReader的使用2.1 配置MyBatisCursorItemReader的注入value="com.taob...

weixin_36378669的博客 852

使用Mybatis流式查询避免OOM

使用mybatis查询数据库,当查询出的数据量过大时会出现OOM异常,可以用流式查询对此类问题进行处理,使用方法如下 再mapper或dao接口中定义查询方法 public interface IPassInfoDao { void queryAllPassInfo(ResultHandler<IPassInfo> iPassInfoResultHandler); } ResultHandler用来处理查询到的数据,流式查询方法必须是void类型 XML:

supreme000的博客 2341
上一篇: 为什么spring单例模式可以支持多线程并发访问
下一篇: win10彻底关闭自动更新(关闭windows update)解决内存占用过高,卡顿问题
T-OPEN
T-OPEN 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄9年 2万+粉丝 241原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值