文
章
目
录
章
目
录
本文主要讲解关于Java如何查询导出百万数量级excel数据相关内容,让我们来一起学习下吧!
一、思路
二、实现
@Slf4j
@Service
public class UsersService {
/**
* 一个线程查1w条
*/
private final Integer threadUserCount = 10000;
@Autowired
private UserMapper userMapper;
public List<User> batchFind(Integer count) {
// 返回的数据集
CopyOnWriteArrayList<User> userList = new CopyOnWriteArrayList<>();
// 数据总量
Integer countUser = userMapper.countUser();
// 需要创建的线程数量
int threadCount = countUser / threadUserCount + 1;
// 线程计数器
final CountDownLatch threadFlag = new CountDownLatch(threadCount);
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
for (int i = 0; i < threadCount; i++) {
// 该线程起始数据
int start = i * threadUserCount;
int threadIndex = i + 1;
executorService.execute(() -> {
List<User> users = userMapper.pageFind(start, threadCount);
userList.addAll(users);
log.info(String.format("execute [%s] thread ,thread data count %s", threadIndex, users.size()));
//计数器-1
threadFlag.countDown();
});
}
try {
// 同步等待 所有的线程执行完
threadFlag.await();
} catch (InterruptedException e) {
log.warn(e.getMessage());
}
return userList;
}
}
三、进阶操作
问题:如果百万的数据,都查出来放在内存,然后需要往外写(导出excel),会使得服务内存飙高,甚至OOM 挂掉。
思路:
- 将读取出来的数据存到队列(第三方的rabbitMQ等)
- 读写分离(一个线程读,多线程去做导出)
- 使用EasyExcel
以上就是Java如何查询导出百万数量级excel数据相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!