使用mybatis查询数据库,当查询出的数据量过大时会出现OOM异常,可以用流式查询对此类问题进行处理,使用方法如下
再mapper或dao接口中定义查询方法
public interface IPassInfoDao {
void queryAllPassInfo(ResultHandler<IPassInfo> iPassInfoResultHandler);
}
ResultHandler用来处理查询到的数据,流式查询方法必须是void类型
XML:
<!--流式查询,客户端游标实现-->
<select id="queryAllPassInfo" resultSetType="FORWARD_ONLY" fetchSize="-2147483648"
resultMap="ResultMapWithBLOBs">
select *from i_pass_info;
</select>
注意参数设置
resultSetType="FORWARD_ONLY" fetchSize="-2147483648",为什么是这个值,可以参考这篇博客https://orchidflower.gitee.io/2018/06/15/Solving-OutOfMemoryException-Happened-when-Exporting-Excel-using-POI-in-Spring-Part2/
调用
@Override
public Integer flowQueryTest() {
iPassInfoDao.queryAllPassInfo(resultContext -> {
//逐条返回
IPassInfo iPassInfo = resultContext.getResultObject();
/**
* 业务代码
*/
++num;
System.out.println("第"+num+"次查询,"+ iPassInfo.toString());
});
return num;
}
获取resultContext中的返回结果,进行相应的操作