我是springBatch chunking的新手。我想了解读者的工作方式
这是一个场景:实现用户帐户的清除 块处理器: 有一个阅读器,它按顺序读取与清除标准匹配的所有用户帐户。 处理器:对于基于某些计算的每个用户帐户,它可以创建一个新的用户帐户,也可以更改当前记录(比如将其标记为已清除)
问题:读者如何运作?说我有5000个用户帐户。如果我的块大小是1000
读者将读取1000条记录,然后启动处理器。 (假设处理器创建了另外100条新记录),现在编写器会写入更新的任何记录
读取下一条1000条记录,读者会再次执行查询吗?它是如何知道从哪里开始的?
我正在使用休眠。
答案 0 :(得分:1)
要回答您的具体问题,这取决于您使用的ItemReader
实施。如果您正在使用JdbcCursorItemReader
,我们会在整个过程中保持光标打开,以便我们真正从一个查询的执行中读取。如果您正在使用JdbcPagingItemReader
,那么下一个块开始的位置将基于分页逻辑。
一对夫妇注意到:
JdbcPagingItemReader
,则每个查询都是唯一的查询,因此如果您添加符合条件的记录,它们也会被返回(我不会100%确定如果会发生什么,如果光标打开时基础数据发生了变化......它可能是数据库本身的一个功能。通常,您将使用标记(时间戳,处理标志等)标记要在该批处理运行中处理的记录。答案 1 :(得分:0)
Chunking的工作方式与你提到的不同。
面向块的处理将一次读取一个数据,并将创建"块"这将写。一旦块中的项目数等于指定的提交间隔,整个块将使用项目编写器写入。
必须仔细设置提交间隔以提高批处理的性能。
例如,假设您在数据库中有1000条记录,根据查询,将读取所有1000条记录。指定的提交间隔为10。
因此,一旦批处理开始执行,它将继续从数据库中读取可用记录并将记录移交给项目处理器(如果已配置,则处理器是可选的)。在此之后,数据将被聚合在一起。一旦累积了10条记录,那么整个10条记录将被送到项目编写者进行写作,交易将被提交。