java 多线程分页读取放入队列,多线程写入EasyExcel

该博客探讨了如何利用Java的多线程技术进行数据分页读取,并将数据高效地放入阻塞队列中,再由多个线程使用EasyExcel进行写入操作,实现了数据处理的并发和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 @Test
    public void test() throws InterruptedException, ExecutionException {
        String resStr = "{\"languageCode\":\"en-US\",\"categoryType\":\"\",\"categoryLevel\":\"\"}";
        GoodsPriceSellListDTO condition = JSON.parseObject(resStr, GoodsPriceSellListDTO.class);
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        int pageSize = 20;
        AtomicInteger pageNumber = new AtomicInteger(1);
        BlockingQueue<List<GoodsPriceSellListDTO>> queue = new ArrayBlockingQueue<>(1000);
        List<GoodsPriceSellListDTO> goodsPriceSellListDTOList = null;
        while (true) {
            if (null != goodsPriceSellListDTOList) {
                goodsPriceSellListDTOList.clear();
            }
            System.out.println("遍历查询:" + pageNumber.get());
            // 线程返回值
            Future&
### EasyExcel 大批量数据导入性能优化最佳实践 在处理大规模数据导入时,EasyExcel 是一种高效的解决方案,其通过封装 Apache POI 并引入流式读取机制来降低内存占用。以下是针对 EasyExcel 进行大批量数据导入时的一些性能优化建议: #### 1. 使用分页读取策略 当面对超大文件时,一次性加载整个 Excel 文件可能导致内存溢出。因此可以采用分页方式逐步读取数据并进行处理。这种方式能够显著减少单次操作所需的内存资源。 ```java // 设置每批读取的记录数 public class DemoDataListener extends AnalysisEventListener<DemoData> { private static final int BATCH_COUNT = 100; @Override public void invoke(DemoData data, AnalysisContext context) { // 数据处理逻辑 } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 完成后的清理工作 } } ``` 此代码片段展示了如何定义一个监听器类 `DemoDataListener` 来控制每次读取的数据批次大小[^1]。 #### 2. 利用缓存技术提升效率 为了进一步提高性能,在实际业务场景中可结合 Redis 或其他分布式缓存工具存储临时计算结果或中间状态信息。这样不仅可以减轻数据库压力还能加速整体流程执行速度。 例如,在某些情况下可能需要频繁访问相同表中的不同字段值,则可以通过预先加载这些常用项至内存从而避免重复查询动作的发生;或者利用 LRU (Least Recently Used)算法管理本地对象池以达到同样的目的。 #### 3. 实现多线程并发写入功能 如果目标环境支持多核处理器架构的话那么考虑启用多个子进程共同完成任务将会是一个不错的选择 。具体做法包括但不限于创建固定数量的工作队列以及分配给各自独立运行单元负责特定范围内的条目解析与持久化保存等工作环节. 需要注意的是虽然理论上增加更多的工作者可能会带来更好的吞吐表现但实际上由于存在锁竞争等因素影响最终效果往往取决于具体情况而定因此务必经过充分测试后再决定最优配置参数设置方案[^2]. #### 4. 减少不必要的转换过程 尽量保持原始输入格式不变直到最后阶段才做必要的映射调整动作这样才能最大限度地保留初始精度同时也减少了因类型强制改变所引发潜在错误风险的可能性[^3]. --- ### 示例代码展示 下面提供了一个完整的例子说明上述提到的各项措施是如何综合运用在一起工作的: ```java import com.alibaba.excel.EasyExcel; import java.util.List; public class LargeScaleImportExample { public static Long startImport(String fileName){ List<YourEntityClass> dataList = new ArrayList<>(); EasyExcel.read(fileName,new YourCustomListener(dataList)).sheet().doRead(); return saveToDatabaseInBatches(dataList); } private static Long saveToDatabaseInBatches(List<YourEntityClass> list){ int batchSize=500; for(int i=0;i<list.size();i+=batchSize){ yourRepository.saveAll(list.subList(i,i+Math.min(batchSize,list.size()-i))); } return generateReportId();//假设这是生成报告id的方法 } } class YourCustomListener extends AnalysisEventListener<YourEntityClass>{ ... } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spjhandsomeman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值