MybatisPlus查询百万数据的内存占用问题?

我在表里添加了500W的测试数据,表中数据如下

一次性读取 500w 数据到 JVM 内存中 必然会造成OOM现象,所以我分别试验了2个读取百万数据的方式,并用Junit分析内存占用

  1. 分页多次查询,并进行深度分页优化
  @Test

void testPage(){

//查询出表中总记录数

Long total = orderMapper.selectCount(null);

//每次分页读取的结果数

int fetchSize = 100000;

// 分页优化参数,上次查询的最大ID

int lastMaxId = 0;

for (int i = 0; i < (total / fetchSize) + 1; i++) {

LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();

orderLambdaQueryWrapper.gt(Order::getOrderId, lastMaxId);

List<Order> records = orderMapper.selectPage(new Page<>(1, fetchSize), orderLambdaQueryWrapper).getRecords();

records.stream().forEach(System.out::println);

//获取本次最大的Id

lastMaxId = records.get(records.size() - 1).getOrderId();

}

}

  1. Mybatis的流式查询
  @Test

void testStream() {

orderMapper.selectList(Wrappers.emptyWrapper(), resultContext -> {

// 依次得到每条业务记录

System.out.println("当前处理第" + resultContext.getResultCount() + "条记录.");

Object order = resultContext.getResultObject();

System.out.println(order);

//做自己的业务处理,比如分发任务

});

}

我从网上看了许多博客,说流式查询可以很好避免OOM问题。
但是为什么在分析堆内存占用中,反而是 多次分页查询的内存占用更小,平均只有400MB
而流式查询却能高达平均1GB的占用?

关于如何开启流式查询是参考的MybatisPlus官网,MybatisPlus版本是也最新的。https://baomidou.com/pages/1922u2/


回答:

因为流式查询也不是一条一条的流,而是一次获取一批数据,处理完了再获取下一批
原理和分页类似但是效率比分页高,因为分页需要‘跳过’前面的记录,而流不需要
如果需要优化的话,找到 fetch size 之类的东西配小一点就行

以上是 MybatisPlus查询百万数据的内存占用问题? 的全部内容, 来源链接: utcz.com/p/945409.html

回到顶部