Java如何查询导出百万数量级excel数据

后端 潘老师 6个月前 (11-21) 118 ℃ (0) 扫码查看

本文主要讲解关于Java如何查询导出百万数量级excel数据相关内容,让我们来一起学习下吧!

一、思路

  1. 拆分(肯定不能一次io返回百万数据,服务可能直接就崩,数据库性能也会受到影响,进而影响其他业务)
  2. 异步查询(如果是同步等待,时间过长,会造成前端接口直接504,网关超时)
  3. 多线程

二、实现


@Slf4j
@Service
public class UsersService {
    /**
     * 一个线程查1w条
     */
    private final Integer threadUserCount = 10000;
    @Autowired
    private UserMapper userMapper;

    public List<User> batchFind(Integer count) {
        // 返回的数据集
        CopyOnWriteArrayList<User> userList = new CopyOnWriteArrayList<>();
        // 数据总量
        Integer countUser = userMapper.countUser();
        // 需要创建的线程数量
        int threadCount = countUser / threadUserCount + 1;
        // 线程计数器
        final CountDownLatch threadFlag = new CountDownLatch(threadCount);
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(threadCount);

        for (int i = 0; i < threadCount; i++) {
            // 该线程起始数据
            int start = i * threadUserCount;
            int threadIndex = i + 1;
            executorService.execute(() -> {
                List<User> users = userMapper.pageFind(start, threadCount);
                userList.addAll(users);
                log.info(String.format("execute [%s]  thread ,thread data count %s", threadIndex, users.size()));
                //计数器-1
                threadFlag.countDown();
            });
        }
        
        try {
            // 同步等待 所有的线程执行完
            threadFlag.await();
        } catch (InterruptedException e) {
            log.warn(e.getMessage());
        }
        return userList;
    }
}


三、进阶操作

问题:如果百万的数据,都查出来放在内存,然后需要往外写(导出excel),会使得服务内存飙高,甚至OOM 挂掉。

思路:

  1. 将读取出来的数据存到队列(第三方的rabbitMQ等)
  2. 读写分离(一个线程读,多线程去做导出)
  3. 使用EasyExcel

以上就是Java如何查询导出百万数量级excel数据相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/11703.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】