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

时间:2014-07-28 20:22:31

标签: hibernate spring-batch chunking

我是springBatch chunking的新手。我想了解读者的工作方式

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

问题:读者如何运作?说我有5000个用户帐户。如果我的块大小是1000

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

读取下一条1000条记录,读者会再次执行查询吗?它是如何知道从哪里开始的?

我正在使用休眠。

2 个答案:

答案 0 :(得分:1)

要回答您的具体问题,这取决于您使用的ItemReader实施。如果您正在使用JdbcCursorItemReader,我们会在整个过程中保持光标打开,以便我们真正从一个查询的执行中读取。如果您正在使用JdbcPagingItemReader,那么下一个块开始的位置将基于分页逻辑。

一对夫妇注意到:

  1. 批处理时使用Hibernate会很棘手。使用Hibernate时会增加复杂性,直接进入数据库时​​可以避免这种情况(更不用说批处理环境中的潜在性能优势)。
  2. 请记住,Spring Batch不会检查基础数据集是否已更改。如果您正在使用JdbcPagingItemReader,则每个查询都是唯一的查询,因此如果您添加符合条件的记录,它们也会被返回(我不会100%确定如果会发生什么,如果光标打开时基础数据发生了变化......它可能是数据库本身的一个功能。通常,您将使用标记(时间戳,处理标志等)标记要在该批处理运行中处理的记录。

答案 1 :(得分:0)

Chunking的工作方式与你提到的不同。

面向块的处理将一次读取一个数据,并将创建"块"这将写。一旦块中的项目数等于指定的提交间隔,整个块将使用项目编写器写入。

必须仔细设置提交间隔以提高批处理的性能。

例如,假设您在数据库中有1000条记录,根据查询,将读取所有1000条记录。指定的提交间隔为10。

因此,一旦批处理开始执行,它将继续从数据库中读取可用记录并将记录移交给项目处理器(如果已配置,则处理器是可选的)。在此之后,数据将被聚合在一起。一旦累积了10条记录,那么整个10条记录将被送到项目编写者进行写作,交易将被提交。