Java-EasyExcel导出Excel优化记录

本文记录了一次针对Java项目中使用EasyExcel导出大量用户数据时遇到的内存溢出问题的调优过程。从最初的简单导出导致的OOM异常,到采用分页查询并限制并发导出数量的逐步优化,最终成功解决了问题。这次优化体现了分治策略和并发控制在处理大规模数据导出中的重要性。
摘要由CSDN通过智能技术生成

背景

最近公司一个项目,需要将系统里面的用户相关的数据导出到Excel,随着用户数据不断增长,现在已经有200多万的数据了。原来的导出方式,导致系统频繁出现内存溢出,迫不得已必须进行改造。

调优过程

以前的代码
    String fileName = URLEncoder.encode("志愿者数据" + DateUtil.today(), "UTF-8");
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
    ServletOutputStream outputStream = response.getOutputStream();
	//根据条件查询符合条件的全部数据,作为系统管理员的时候,可以导出数据库中的全部数据。
	List<VolunteerUserVo> result = volunteerUserService.searchAll(x, null, null, null, volunteerName, labelName, phoneNumber, areaCode, StatusEnum.AUDIT.getValue() + "",
                    i, EXCEL_EXPORT_THRESHOLD, null, getSessionUser(token)).getResult();
	EasyExcel.write(outputStream).sheet("sheet").doWrite(result);
重构第一版
/**
     * 导出Excel时,单次查询返回数量的阈值50W
     * 如果需导出的数量超过该阈值,分批次查询数据
	 * 这里这个阈值的设定,根据各位机器的实际情况而定
     */
    private static final Integer EXCEL_EXPORT_THRESHOLD = 500000;
	//查询符合条件的志愿者数量
	Long count = volunteerUserService.searchCount(sex, areaCode, volunteerName, phoneNumber, labelName, getSessionUser(token));
        long page = 1;
        if (count > EXCEL_EXPORT_THRESHOLD) {
   
            if (count % EXCEL_EXPORT_THRESHOLD == 0) {
   
                page = count / EXCEL_EXPORT_THRESHOLD;
            } else {
   
                page = count / EXCEL_EXPORT_THRESHOLD + 1
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值