Spring批处理块,如果结果集发生变化,读取器如何工作?

2024-01-08

我是 Spring Batch 分块的新手。我想了解阅读器是如何工作的

这是场景:实施用户帐户的清除 块处理器: 有一个读取器,可以按顺序读取与清除条件匹配的所有用户帐户。 处理器:对于基于某些计算的每个用户帐户,它可能会创建一个新的用户帐户并更改当前记录(例如将其标记为已清除)

问题:阅读器如何工作?假设我有 5000 个用户帐户。如果我的块大小是 1000

读取器将读取 1000 条记录,然后启动处理器。 (假设处理器创建了另外 100 个新记录),现在 writer 写入更新的任何记录

读取接下来的 1000 条记录时,读取器是否会再次执行查询?它怎么知道从哪里开始?

我正在使用休眠。


要回答您的具体问题,这取决于ItemReader您使用的实现。如果您正在使用JdbcCursorItemReader,我们在整个过程中保持游标打开,因此我们实际上是在读取一个查询的执行结果。如果您正在使用JdbcPagingItemReader,那么下一个块的开始位置取决于分页逻辑。

一些注意事项:

  1. 使用 Hibernate 进行批处理可能会很棘手。使用 Hibernate 时会增加一些复杂性,而直接访问数据库时可以避免这些复杂性(更不用说批处理环境中的潜在性能优势)。
  2. 请记住,Spring Batch 不会检查底层数据集是否已更改。如果您正在使用JdbcPagingItemReader,每个查询都是一个唯一的查询,因此如果您添加满足条件的记录,它们也会被返回(我不能 100% 确定如果在游标打开时基础数据发生更改会发生什么......它可能是一个函数数据库本身)。通常,您将使用一些标记(时间戳、处理标记等)来标记要在该批处理运行中处理的记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring批处理块,如果结果集发生变化,读取器如何工作? 的相关文章

随机推荐