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