实例
List<Object> list = new ArrayList<>(10000);
int BATCH_SIZE = 1000;
ExecutorService executorService = Executors.newFixedThreadPool(5);
int totalBatches = (int) Math.ceil((double) list.size() / BATCH_SIZE);
//计数
CountDownLatch countDownLatch = new CountDownLatch(totalBatches);
try {
AtomicBoolean atomicBoolean = new AtomicBoolean(false);
for (int i = 0; i < totalBatches; i++) {
int startIndex = i * BATCH_SIZE;
int endIndex = Math.min(startIndex + BATCH_SIZE,list.size());
List<Object> subList = list.subList(startIndex, endIndex);
executorService.submit(() -> {
try {
//insert
}catch (Exception e){
atomicBoolean.set(true);
}finally {
countDownLatch.countDown(); //减一
}
});
}
//当所有线程就绪后启动
countDownLatch.await();
if (atomicBoolean.get()){
throw new RuntimeException();
}
} catch (Exception e) {
//删除数据
throw new RuntimeException(e);
} finally {
executorService.close();
}
总结
当大数据量以N多个文件时,使用该方式速度会有显著提升。该方式使用的是mybatis的自动提交方式。当在多线程运行中出现问题,可直接删除该文件的数据,确保每个文件都可以完整入库。
也可以尝试使用事务的方式,但每次提交的数据不能太多,否则提交事务会有很大耗时。