Mybatis的Cursor的流式查询,可用于防止一次性查询数据过大,导致客户端内存溢出等问题。注意点在获取cursor迭代时会出现 cursor closed的异常,解决方法之一是是增加事务。
原因:
1.cursor的每一次迭代类似于一次mapper的查询,若没有显示指定事务(不设定也是有事务的,而不是没有事务),则默认是自动提交,并且关闭cursors(源码中有),但对于guice框架的servlet,其会自动给每个请求增加事务,可能不会出现游标异常关闭的问题。
2.显示指定事务,比如给方法增加@Transactional注解,beginTransaction, commit等,其本质是,将autocommit设为false,在业务代码片段(包含cursor全部迭代部分)手动提交,不会出现cursor被关闭情况。好像说了废话。