背景
在实际工作中,往往会有批量查询或批量导出这样的需求,但是如果数据量很大,就不能简单的使用 in 查询来解决问题。常见的优化思路是分批处理(分而治之),今天我就来讲一下,基于CompletableFuture+多线程+内存分页实现的批量查询技巧。
实现思路
- 定义一个线程池,专门用来处理批量导出业务,和其它业务隔离。
- 先获取需要处理的总记录数,判断是否需要批量处理,如果不需要,则直接返回,如果需要则进行批量异步处理,批量处理过程中会使用到自定义的线程池。
- 统一收集异步返回的数据,进行下一步处理即可。
- 完毕
原料
- ThreadPoolTaskExecutor
- CompletableFutrue
实现细节
定义用于批处理的线程池 ThreadPoolTaskExecutor,也可以用 Java 原生自带的线程池 Executors
/**
* Spring 线程池配置组件
*
* @Author Zack
*/
@Configuration
@Ena