HarmonyOS 6学习:ContactsKit参数陷阱与401错误排查实战
2026/5/8 14:18:37
大数据量 Excel 导入的性能与内存优化实战
一 核心原则
二 读取与解析层优化
三 数据库写入层优化
四 架构与工程化优化
五 参数与配置建议
六 落地代码示例
publicclassBatchExcelListener<T>extendsAnalysisEventListener<T>{privatefinalintbatchSize;privatefinalList<T>batch=newArrayList<>(batchSize);privatefinalConsumer<List<T>>processor;privatefinalAtomicIntegertotal=newAtomicInteger();privatefinalAtomicIntegerfailed=newAtomicInteger();publicBatchExcelListener(intbatchSize,Consumer<List<T>>processor){this.batchSize=Math.max(500,batchSize);this.processor=processor;}@Overridepublicvoidinvoke(Tdata,AnalysisContextctx){if(isValid(data))batch.add(data);elsefailed.incrementAndGet();if(batch.size()>=batchSize)processBatch();total.incrementAndGet();}@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextctx){if(!batch.isEmpty())processBatch();}privatevoidprocessBatch(){try{processor.accept(newArrayList<>(batch));// 批处理(如批量入库)batch.clear();}catch(Exceptione){failed.addAndGet(batch.size());// 可加入重试:最多3次}}privatebooleanisValid(Td){returnd!=null;}// 简化示例}@ServicepublicclassExcelImportService{@AutowiredprivateYourDataServicedataService;privatefinalExecutorServiceexecutor=Executors.newFixedThreadPool(8);// 按CPU/IO调整publicvoidimportMultiSheet(InputStreamin){List<Future<?>>futures=newArrayList<>();for(inti=0;i<20;i++){// 假设20个SheetintsheetNo=i;Future<?>f=executor.submit(()->{EasyExcel.read(in,RowDto.class,newBatchExcelListener<>(2000,batch->dataService.batchInsert(batch))).sheet(sheetNo).doRead();});futures.add(f);}// 等待全部完成for(Future<?>f:futures){try{f.get();}catch(Exceptionignore){}}executor.shutdown();}}@RestControllerpublicclassImportController{@AutowiredprivateExcelImportServiceimportService;@AutowiredprivateTaskServicetaskService;@PostMapping("/import")publicCommonResultstart(@RequestParam("file")MultipartFilefile){StringtaskId=taskService.createTask();CompletableFuture.runAsync(()->{try(InputStreamin=file.getInputStream()){importService.importMultiSheet(in);taskService.complete(taskId,"SUCCESS");}catch(Exceptione){taskService.fail(taskId,e.getMessage());}},taskExecutor());returnCommonResult.ok(taskId);}@Bean("taskExecutor")publicExecutortaskExecutor(){ThreadPoolTaskExecutorex=newThreadPoolTaskExecutor();ex.setCorePoolSize(4);ex.setMaxPoolSize(8);ex.setQueueCapacity(50);ex.setThreadNamePrefix("import-");ex.initialize();returnex;}}<insertid="batchInsert"parameterType="list">INSERT INTO your_table(col1, col2) VALUES<foreachcollection="list"item="e"separator=",">(#{e.col1}, #{e.col2})</foreach></insert>:通过流式读取 + 分批批量写入 + 异步并发,可稳定支撑十万至百万级数据导入;在合理参数与数据库优化配合下,导入耗时与内存占用均可控。