Cursor使用—>实现流式查询
链接: https://segmentfault.com/a/1190000022478915
简介
流式查询
指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用
。
如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足够的内存时,就不得不分页查询
,而分页查询效率取决于表设计,如果设计的不好,就无法执行高效的分页查询。因此流式查询是一个数据库访问框架必须具备的功能。
在mybatis 3.4.0版本中新增了一个功能,查询可以返回Cusror类型的数据,类似于JDBC里的ResultSet类,当查询百万级的数据的时候,使用游标可以节省内存的消耗,不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理
。
流式查询的过程当中,数据库连接是保持打开状态的
,因此要注意的是:执行一个流式查询后,数据库访问框架就不负责关闭数据库连接了,需要应用在取完数据后自己关闭。
例:
@Transactional
public GraceJSONResult getAll() throws IOException {
ArrayList<AppUser> appUsers = new ArrayList<>();
try (Cursor<AppUser> byPage = userService.getAllUser()) {
Iterator<AppUser> iterator = byPage.iterator();
while (iterator.hasNext()){
//
for(int i=0;i<10 && iterator.hasNext();i++){
appUsers.add(iterator.next());
}
}
}
doSomething(appUsers);
appUsers.clear();
}
它仅仅是在原来方法上面加了个 @Transactional 注解。这个方案看上去最简洁,但请注意 Spring 框架当中注解使用的坑:只在外部调用时生效。在当前类中调用这个方法,依旧会报错。