
本文介绍一种高效、可靠的分区策略,用于处理百万级数据:在指定最小分区大小的前提下,确保相同键值的元素不被拆分到不同分区中,从而满足数据库批量查询对连续键范围的需求。
本文介绍一种高效、可靠的分区策略,用于处理百万级数据:在指定最小分区大小的前提下,确保相同键值的元素不被拆分到不同分区中,从而满足数据库批量查询对连续键范围的需求。
在处理大规模数据(如 100 万条记录)并需分批调用数据库时,简单按固定大小切分列表(如 ListUtils.partition)虽高效,但存在关键缺陷:相同业务键(如 Car.key)可能被分散到多个分区,导致后续 DB 查询无法准确覆盖全部关联记录,甚至引发数据遗漏或重复处理。
例如,原始数据按 key 排序后为:[Car{key=1}, Car{key=2}, Car{key=2}, Car{key=3}, ...]
若强制按 chunkSize=2 切分,将得到:
- Partition 1:
[key=1, key=2] - Partition 2:
[key=2, key=3]
→key=2被割裂,违反“同键聚合”需求。
✅ 正确解法的核心前提是:数据需按键有序(sorted or clustered)。在此基础上,我们实现“粘性分区(sticky partitioning)”——当一个分区末尾元素的键与下一个元素相同时,自动扩展该分区边界,直至键值变化。
以下是推荐的工业级实现(Java 17+):
stream().sorted(comparing(Car::key))










