《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景:

        在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。

        因为要写入csv文件,涉及到文件的输出流。

        之前讨论针对的解决方案:
        1、分页
        2、流式数据读取加工


技术栈选择-原因(个人理解)

分页:

        1、分页查询涉及到查询的效率

        2、并且也存在内存问题,只是将一个大的内存改变成了小的任务

流式:

        流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。

阿丹:所以直接使用流式查询直接一步到位。

实践!:

        第一次尝试:

        第一次尝试失败告终。

        使用了单纯的流式查询,确实对于内存比较友好,但是出现问题为。

因为是流式的读取导致处理的速度太慢,并且因为是流式读取在大数据集的情况下有时间效率非常低。所以还是有点鸡肋的。

        所以尝试看能不能在流式处理的过程中也考虑一下使用异步的方式多任务并行来处理。那么久涉及到了分页。于是有方案二。

第二次方式:

首先先解释一下流式查询是如何使用的:
我会将代码和逻辑展示出来其实逻辑还是比较简单的

流式查询使用:

 //流式
        dorisMapper.dorisjdbExportDownSQL(recordId,cDates,userId,saleIds,userName,taskId,status,sendMode,productId,checkTask,beginTime,endTime,parent,intercept,phoneCount,title,attribution_up,offset,limit,new ResultHandler(){
            /**
             * 处理回调逻辑
             */
            @Override
            public void handleResult(ResultContext resultContext){
                resultContext.getResultObject()//这里就可以获得数据对象
                }
            }
        });

 解释:这里的handleResult为拿到的数据的指针也是拿到数据的回调函数,我们可以在这里来将数据一条一条拿出来并加工。《MyBatis》-- 流式查询内存性能优化-单条数据加工_第1张图片

重点1:需要将整个流式读取使用数据库的事件来限制
StopWatch watch = new StopWatch();
        watch.start();
/**
*这里写流式读取的代码块
*/
watch.stop();
重点2:mapper的xml中写法配置
一、构建映射resultmap

《MyBatis》-- 流式查询内存性能优化-单条数据加工_第2张图片

在指定resultmap的时候一定注意实体类的位置,要映射正确

二、查询语句添加配置

在MyBatis框架中,resultSetType属性用于配置结果集的读取方式。对于给出的