主要思路,批量添加和多线程处理
1.开启批量语句重写功能
durid:url :rewriteBatchedStatements=true
2.Db.executeBatch 可以用于进行批量的插入、修改和删除
Db.executeBatch(accounts.size(), 1000, AccountMapper.class, (mapper, index) -> { Account account = accounts.get(index); mapper.insert(account); });
3.使用自定义线程池
CompletableFuture.runAsync(() -> {
#2方法的批量添加
batchInsertInsuranceInfo(recordList, settlementId, orgId);
}, SpringUtil.getBean("asyncServiceExecutor", Executor.class));
4 自定义实现ReadListener
/**
* 每隔10000条存储数据库 然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 10000;
添加用于收集异步任务结果的列表 private final List<CompletableFuture<Void>> futures = new ArrayList<>();
/**
* 异步存储数据库
*/
private void saveDataAsync() {
log.info("开始异步存储数据库!");
// 将当前批次数据复制一份,避免后续清理影响异步任务
List<PolicyPropertyParam> batchData = new ArrayList<>(cachedDataList);
CompletableFuture<Void> future = policyPropertyService
.batchInsertInsuranceInfoAsync(batchData, policyPropertySettlementId, orgId);
futures.add(future);
log.info("提交异步存储任务完成!");
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
if (!cachedDataList.isEmpty()) {
saveDataAsync();
}
//等待所有任务完成
try {
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
log.info("所有数据解析和存储完成!");
} catch (Exception e) {
log.error("批量导入过程中发生错误", e);
Asserts.fail("批量导入失败: " + e.getMessage());
}
}
5.关闭日志打印(非常耗时,解析的日志和sql的打印日志,)
@Override
public void invoke(PolicyPropertyParam record, AnalysisContext analysisContext) {
//日志打印影响速度
log.debug("解析到一条数据:{}", JSON.toJSONString(record));
}
最终测试环境耗时20秒,导入成功!

被折叠的 条评论
为什么被折叠?



