大量数据分批次处理简单实现思路
一、实现思路
- 分页策略:使用分页,设置合理的分页大小(如1000条/页)
- 线程安全:使用同步机制或分布式锁保证多线程分页查询不重复不遗漏
- 性能优化:避免一次性加载所有数据,采用分批处理
- 异常处理:考虑网络中断等异常情况,实现重试机制
二、关键点说明
- 线程安全:使用
ReentrantLock
确保多线程环境下分页查询的顺序性 - 分页控制:通过volatile变量
currentPage
记录当前页码 - 性能优化:合理设置
pageSize
(建议500-2000之间) - 异常处理:
finally
块确保锁一定会释放
三、示例
@Service
public class PageQueryService {
private final ReentrantLock lock = new ReentrantLock();
private volatile int currentPage = 1;
/**
* 线程安全的分页查询方法
* @param pageSize 每页大小
* @param queryWrapper 查询条件
* @return 当前页数据
*/
public <T> IPage<T> safePageQuery(int pageSize, QueryWrapper<T> queryWrapper) {
lock.lock();
try {
Page<T> page = new Page<>(currentPage, pageSize);
IPage<T> result = mapper.selectPage(page, queryWrapper);
if (result.getRecords().isEmpty()) {
return null; // 已查询完所有数据
}
currentPage++;
return result;
} finally {
lock.unlock();
}
}
}
public void processAllData() {
int pageSize = 1000; // 每页1000条
QueryWrapper<YourEntity> wrapper = new QueryWrapper<>();
// 可以添加查询条件
// wrapper.eq("status", 1);
while (true) {
IPage<YourEntity> page = pageQueryService.safePageQuery(pageSize, wrapper);
if (page == null || page.getRecords().isEmpty()) {
break; // 所有数据已处理完
}
// 处理当前页数据
processPageData(page.getRecords());
}
}
private void processPageData(List<YourEntity> records) {
// 实现你的业务逻辑
}
四、注意事项
- 大数据量查询建议添加合适的索引
- 考虑使用游标方式(Cursor)处理超大数据集
- 分布式环境下需要使用分布式锁替代
ReentrantLock
- 长时间运行的任务需要添加断点续查机制
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果