Spring batch 非分布式数据\uuSpring批处理分区器

Spring batch 非分布式数据\uuSpring批处理分区器,spring-batch,batch-processing,partitioning,partition,database-partitioning,Spring Batch,Batch Processing,Partitioning,Partition,Database Partitioning,举个例子,我从一个有数百万行的数据库中读取数据,对数据做一些处理,然后更新它 我正在使用一个列范围分区器Id列来处理最小和最大Id,并使用Max-Min/gridSize创建分区 现在假设我有ID 1、22、23、24、30,gridSize=3,根据该逻辑,我将有3个分区: 分区1处理Id 1 分区2正在处理0行 分区3处理22、23、24和30 对于数以百万计的数据,像这样的并行处理是没有用的,并且尝试在一个请求中恢复所有数据以实现分布式分区需要花费很长时间 最好的解决方案是什么?示例中显示

举个例子,我从一个有数百万行的数据库中读取数据,对数据做一些处理,然后更新它

我正在使用一个列范围分区器Id列来处理最小和最大Id,并使用Max-Min/gridSize创建分区

现在假设我有ID 1、22、23、24、30,gridSize=3,根据该逻辑,我将有3个分区:

分区1处理Id 1

分区2正在处理0行

分区3处理22、23、24和30

对于数以百万计的数据,像这样的并行处理是没有用的,并且尝试在一个请求中恢复所有数据以实现分布式分区需要花费很长时间

最好的解决方案是什么?

示例中显示的ColumnRangePartitioner指出,您需要一个均匀分布的列,才能使其如您所指出的那样有效。相反,您通常可以向查询中添加一个行号,并对其进行分区,因为它将是结果上的一个序列

MySQL的SQL示例如下所示:

选择F.*, @rownum:=@rownum+1作为排名 来自FOO F, 选择@rownum:=0 r; 这样,列秩将是每次运行查询时自动生成的序列。根据该值,可以对数据集进行分区。因为这不是持久性的,所以您需要做一些练习来获得正确的ID,但是分区器实现的基本逻辑如下所示:

运行计数查询以了解数据集中有多少记录。 使用上述技术运行一个查询,以确定每个分区范围的开始和结束的db id。这将为您提供每个分区要过滤的ID。 使用实际的db ID为每对开始/结束创建一个分区。 将ItemReader设置为仅读取提供的db ID范围内的项目。
你是什么意思?在开始作业之前,向表中添加另一列并按顺序设置它?你能解释一下吗?我原以为不创建临时表和列组列也是可能的,但我最终还是这么做了。谢谢你的回答