mybatisPlus、BigExcelWriter大数据量流式查询并导出

mybatisPlus、BigExcelWriter大数据量流式查询并导出

  • 参考
  • mybatisPlus流式查询
    • 使用场景
    • 使用
  • 大数量导出到excel
    • 使用场景
    • 使用

参考

https://coldsmog.cn/project-4/doc-177/
https://doc.hutool.cn/pages/BigExcelWriter/

mybatisPlus流式查询

使用场景

传统查询是一次性取出所有数据然后处理,对上百万的数据突出两个问题:

  1. 处理时间长,阻塞数据库IO;
  2. 一次性占用内存多,易OOM;

因此流式查询则使用数据库游标,查一行处理一行,消耗内存较少,不阻塞数据库IO,在大数据处理场景中推荐使用。

使用

DAO层的流式处理函数的声明

@Repository
public interface SysLogMapper extends BaseMapper<SysLog> {

    @Select("select id, type, title, remote_addr, username, request_uri, use_time, browser, exception ,request_time FROM sys_log  ${ew.customSqlSegment}")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
    @ResultType(SysLog.class)
    void selectSysLogList(@Param(Constants.WRAPPER) QueryWrapper<SysLog> queryWrapper, ResultHandler<SysLog> handler);
}

流式处理的使用

sysLogMapper.selectSysLogList(queryWrapper,new ResultHandler<SysLog>(){
            @Override
            public void handleResult(ResultContext<? extends SysLog> resultContext) {
                SysLog sysLog = resultContext.getResultObject();
                // 处理函数,此处用lambda从而让可以将处理函数单独拆出来
                // 当然,你也可以直接在此处理
            }
        });

Oracle的fetchSize建议设置成1000,MySQL的fetchSize建议设置成Integer.MIN_VALUE

大数量导出到excel

使用场景

对于大量数据输出,采用EasyExcel.write()或者hutool的ExcelWriter容易引起内存溢出,因此有了BigExcelWriter。

使用

ExcelWriter writer = ExcelUtil.getBigWriter();
//sysLogList为要写入的数据集合
writer.write(sysLogList);
writer.flush(outputStream,true);
writer.close();

你可能感兴趣的:(java)