前言
最近有个任务就是在30s内读取几十万的数据并处理,单线程的情况下根本无法完成,而且一次性读取这么大的数据量也怕oom,所以引入流式读取解决一次性读取大数据量的问题。
流式读取注意点
1、不允许自定义的ResultHandler
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException:
Mapped Statements with nested result mappings cannot be safely used with a custom ResultHandler.
Use safeResultHandlerEnabled=false setting to bypass this check.
2、流式读取不起作用
- 检查fetchSize="-2147483648",不是这个流式不起作用
- 检查mapper接口的返回值,流式是没有返回值的,是void。
相关代码段
service
List<TaskDispatchExt> streamList = new ArrayList<>();
taskDispatchMapperExt.getNoLeaveLoadDispatchList(statusList, new ResultHandler<TaskDispatchExt>() {
@Override
public void handleResult(ResultContext<? extends TaskDispatchExt> resultContext) {
streamList.add(resultContext.getResultObject());
}
});
mapper接口
void getNoLeaveLoadDispatchList(@Param("statusList") List<String> statusList, ResultHandler<TaskDispatchExt> handler);
mapper.xml
<select id="getNoLeaveLoadDispatchList" parameterType="map" resultMap="ExtResultMap3" resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
</select>
结语
很多问题不写不知道,一写全是异常和问题,所以多记录记录,给小伙伴们避避坑,也能省事和提高效率。