// 根据异步操作数设置线程
private ExecutorService threadPool = Executors.newFixedThreadPool(16);
@ApiOperation("多线程插入百万级数据--结果:开8个线程117秒; 开10个 111秒")
@GetMapping("testMultithreadingBatchInsert")
public String testMultithreadingBatchInsert() {
List<MainSysWlDet> insertlist = ADOConnection.runTask(factory->{
MainSysWlDetMapper mapper = factory.getMapper(MainSysWlDetMapper.class);
return mapper.queryAll();
}, List.class);
Date big = DateUtil.date(System.currentTimeMillis());
// 倒计时数为异步线程数
CountDownLatch latch = new CountDownLatch(16);
// 每份大小
int spileSize = insertlist.size() / 16;
// 异步返回结果
List<Future<Boolean>> futures = new ArrayList<>();
Lists.partition(insertlist, spileSize).stream().forEach(par -> {
// 遍历需要异步的请求,并提交至线程池
Future<Boolean> submit = threadPool.submit(() -> {
List<List<MainSysWlDet>> parpar = Lists.partition(par, 300);
Boolean flag = ADOConnection.runTask(factory->{
for (List<MainSysWlDet> ppi : parpar) {
MainSysWlDetTempMapper mapper = factory.getMapper(MainSysWlDetTempMapper.class);
mapper.batchInsert(ppi);
}
return true;
}, Boolean.class);
// 调用await方法等待
latch.countDown();
return flag;
});
futures.add(submit);
});
try {
// 等待本地提交的异步操作完成
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
Date end = DateUtil.date(System.currentTimeMillis());
System.out.println(DateUtil.between(big, end, DateUnit.SECOND) + "秒");
return DateUtil.between(big, end, DateUnit.SECOND) + "秒";
}
java 多线程批量入库
最新推荐文章于 2025-06-18 15:34:19 发布