mybatis 游标查询_Mybatis超量查询解决方案

本文主要探讨了在遇到Mybatis查询引发的内存溢出问题时的解决方案,包括普通查询的优化、流式查询的实现以及分页查询的使用。通过流式查询利用ResultHandler逐条处理结果,减少内存消耗,以及利用Mybatis分页插件进行高效分页,避免一次性加载大量数据。这些方法在处理大数据量场景时能够有效防止OOM问题。
摘要由CSDN通过智能技术生成

最近碰到sql查询出错的问题,原因即是OOM(out of memory 内存溢出),GC回收内存查询GC limited expeed问题,为此给出几种方案比较;

1 普通查询

原始mybatis语句:

select from user_messages

where created_time between '2018-01-01' and '${currentYear}-12-31'

and DATEDIFF(#{date,jdbcType=VARCHAR},created_time)=0

对于普通sql查询,上面写法足以满足需求,Mybatis作为一个优秀的ORM框架极大方便了我们对数据库CUID的操作,但是Mybatis对底层JDBC的封装同时也给我们底层调优带来了一些问题。当一次查询数据过多,比如1000W条数据得场景,就会出现OOM,这个时候JDBC可能采用返回游标的方式就可以完成。Oracle和MySQL在服务器端已经帮我们完成游标偏移,这样也使得客户端可以用较少内存来处理数据库返回的数据,下面介绍流式查询。

2 流式查询

将普通查询改为流式查询,本质是Mybatis提供了回调ResultHandler方式可以完成数据逐条访问,这种方式在大数据量场景非常有用,可以均衡系统复杂性和系统资源占用两个因素。

改造前:

//DAO层

public interface DataMapper {

List getAllUsers();

}

//mapper xml :

select FUND_ACCOUNT from fundacco

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值