Spring batch partitioning master 可以读取数据库并将数据传递给worker?

Spring batch partitioning master can read database and pass data to workers?

我是 spring 批处理的新手,正在尝试设计一个必须从数据库中读取 2000 万条记录并进行处理的新应用程序。

我不认为我们可以通过一个单独的 JOB 和 Step(在一个线程中按顺序)来做到这一点。

我想我们可以在 Partitioning 中做到这一点,其中步骤被划分为 master 和多个 worker(每个 worker 是一个线程,它执行自己的进程可以 运行 并行)。

我们必须读取一个 table(existing table),它有 2000 万条记录并处理它们,但是在这个 table 中,我们没有任何自动生成的序列号,它有主键,例如 10 位数字的雇主编号。

我检查了一些分区示例代码,我们可以在其中将范围传递给给定范围的每个工作人员和工作进程,例如 worker1 从 1 到 100 和 worker2 101 到 200 ......但在我的情况下这是行不通的,因为我们不'有序列号作为范围传递给每个工人。

在 Partitioning 中,master 可以从数据库中读取数据(比如 1000 条记录)并将其传递给每个 worker 以发送范围? .

或者对于上述情况,您有没有其他更好的方法建议。

原则上,returns 以确定顺序生成行的任何查询都可以按照您通过 OFFSETLIMIT 选项提到的示例进行分区。 ORDER BY 可能会显着增加查询执行时间,但如果您按 table 的主键排序,那么这种影响应该不太明显,因为 table 的索引已经被排序.所以我会先尝试这种方法,因为它是最优雅的恕我直言。 但是请注意,在直接从 JdbcCursorItemReader 处理大量结果集时,您可能 运行 遇到其他问题,因为某些 RDBMS(例如 MySQL)不会对您处理的速度感到满意d 获取与处理互锁的行。因此,根据您处理的复杂性,我建议尽早在这方面验证设计。 不幸的是,无法按照您的建议检索分区的整个 table 行集并将其作为参数传递给工作步骤,因为该参数不能序列化为超过千字节(或按该顺序的东西)震级)。 另一种方法是检索每个分区的数据并将其存储在某处(如果大小允许,则存储在内存中的映射条目中,或者存储在文件中),然后将对该资源的引用作为参数传递给工作步骤,然后工作步骤读取并处理它。