文章目录
- Excel多线程导入数据库
-
- [1. CountDownLatch](#1. CountDownLatch)
- 2.多线程导入数据库
Excel多线程导入数据库
书接上文 Excel20w数据5s导入
1. CountDownLatch
CountDownLatch 维护了一个计数器,初始值为指定的数量。当一个或多个线程调用 await() 方法时,它们会被阻塞,直到计数器的值变为 0。而其他线程可以通过调用 countDown() 方法来减小计数器的值,当计数器的值变为 0 时,所有处于等待状态的线程都会被唤醒。
需要注意的是,CountDownLatch 是一次性的,即计数器的值减为 0 后就不能再重置成其他值。
2.多线程导入数据库
dao
java
@Insert("insert into excel(id,name,age) values (#{id},#{name},#{age})")
void insert(Man man);
service
java
public String add5() {
ExcelReader reader = ExcelUtil.getReader(FileUtil.file("C:\\Users\\26896\\Desktop\\test.xlsx"), "sheet1");
long startTime1 = System.currentTimeMillis();
try {
CountDownLatch latch = new CountDownLatch(200);
int batch = 1000;
for (int i = 1; i <= 200000; i += batch) {
final int start = i; // 将循环变量赋值给新变量 start
final int end = i + batch - 1; // 计算结束位置
executor.submit(() -> {
List<Man> read = reader.read(0, start, end, Man.class);
excelDao.add(read);
latch.countDown();
});
}
latch.await();
long startTime = System.currentTimeMillis();
System.out.println("最终的结果为:" + (startTime - startTime1));
} catch (Exception e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
return null;
}
测试只需要在测试类中注入service调用方法即可
测试结果 这个结果包括从read读数据所以相对而言可能慢一点