Spring Batch 应用程序定期从数据库中拉取数据
SpringBatch application periodically pulling data from DB
我正在开发 spring 批处理服务,该服务按计划从数据库中提取数据。 (例如每天中午 12 点)
我正在使用 JdbcPagingItemReader 来读取数据和调度程序(@Scheduled 由 spring 批处理提供)来启动作业。我现在遇到的问题是:每次作业运行时,它只会从头开始而不是从“上次读取”行中提取所有数据。
来自数据库的数据每天都在变化(删除旧数据并添加新数据),我所拥有的只是一个时间戳列来跟踪它们。
有没有办法“记住”作业上次执行时读取的最后一行,并只读取该行之后的数据?
由于您需要每天提取数据,并且您的记录有时间戳,因此您可以将作业实例设计为基于给定日期(即使用日期作为识别作业参数)。使用这种方法,您不需要“记住”最后处理的记录。您需要做的就是使用正确的 SQL 查询处理给定日期的记录。例如:
Job instance ID
Date
Job parameter
SQL
1
2021-03-22
date=2021-03-22
Select c1, c2 from table where date = 2021-03-22
2
2021-03-23
date=2021-03-23
Select c1, c2 from table where date = 2021-03-23
...
...
...
...
有了它,您可以使用任何基于游标或基于分页的 reader 来处理给定日期的记录。如果作业实例失败,您可以重新启动它而不会干扰其他作业实例。重启甚至可以在失败后几天完成,因为作业实例将始终处理相同的数据集。此外,在失败和作业重新启动的情况下,Spring 批处理将从上一个(失败)运行.
的最后一个检查点开始重新处理记录
只想post更新这个问题。
所以最后我又创建了两个步骤来实现我最初想要做的事情。
由于我没有修改我从中读取数据的 table 的特权,因此我无法使用“进程指示器模式”,它涉及有一个列来标记记录是否已处理。我创建了另一个 table 来存储最后读取记录的时间戳,并用它来更新 sql 查询。
- 第 0 步:从 table 读取书签的 tasklet,将其传递到作业上下文
- 第一步:一个chunk步骤,从上下文中获取书签,使用jdbcPagingItemReader读取数据
- 第 2 步:更新书签的 tasklet
但是这样做我必须非常小心书签table。如果我输了,我就失去了一切
我正在开发 spring 批处理服务,该服务按计划从数据库中提取数据。 (例如每天中午 12 点) 我正在使用 JdbcPagingItemReader 来读取数据和调度程序(@Scheduled 由 spring 批处理提供)来启动作业。我现在遇到的问题是:每次作业运行时,它只会从头开始而不是从“上次读取”行中提取所有数据。 来自数据库的数据每天都在变化(删除旧数据并添加新数据),我所拥有的只是一个时间戳列来跟踪它们。
有没有办法“记住”作业上次执行时读取的最后一行,并只读取该行之后的数据?
由于您需要每天提取数据,并且您的记录有时间戳,因此您可以将作业实例设计为基于给定日期(即使用日期作为识别作业参数)。使用这种方法,您不需要“记住”最后处理的记录。您需要做的就是使用正确的 SQL 查询处理给定日期的记录。例如:
Job instance ID | Date | Job parameter | SQL |
---|---|---|---|
1 | 2021-03-22 | date=2021-03-22 | Select c1, c2 from table where date = 2021-03-22 |
2 | 2021-03-23 | date=2021-03-23 | Select c1, c2 from table where date = 2021-03-23 |
... | ... | ... | ... |
有了它,您可以使用任何基于游标或基于分页的 reader 来处理给定日期的记录。如果作业实例失败,您可以重新启动它而不会干扰其他作业实例。重启甚至可以在失败后几天完成,因为作业实例将始终处理相同的数据集。此外,在失败和作业重新启动的情况下,Spring 批处理将从上一个(失败)运行.
的最后一个检查点开始重新处理记录只想post更新这个问题。
所以最后我又创建了两个步骤来实现我最初想要做的事情。 由于我没有修改我从中读取数据的 table 的特权,因此我无法使用“进程指示器模式”,它涉及有一个列来标记记录是否已处理。我创建了另一个 table 来存储最后读取记录的时间戳,并用它来更新 sql 查询。
- 第 0 步:从 table 读取书签的 tasklet,将其传递到作业上下文
- 第一步:一个chunk步骤,从上下文中获取书签,使用jdbcPagingItemReader读取数据
- 第 2 步:更新书签的 tasklet
但是这样做我必须非常小心书签table。如果我输了,我就失去了一切