背景
大数据量操作的场景大致如下:
- 数据迁移
- 数据导出
- 批量处理数据
在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时,如果一下子将数据全部加载出来到内存中,很可能会发生OOM(内存溢出);而且查询会很慢,因为框架耗费大量的时间和内存去把数据库查询的结果封装成我们想要的对象(实体类)。
举例:在业务系统需要从 MySQL 数据库里读取 100w 数据行进行处理,应该怎么做?
做法通常如下:
- 常规查询: 一次性读取 100w 数据到 JVM 内存中,或者分页读取
- 流式查询: 建立长连接,利用服务端游标,每次读取一条加载到 JVM 内存(多次获取,一次一行)
- 游标查询: 和流式一样,通过 fetchSize 参数,控制一次读取多少条数据(多次获取,一次多行)