【问题标题】:Spring batch chunk processing , how does the reader work ?if the result set changes?Spring批处理块处理,如果结果集发生变化,阅读器如何工作?
【发布时间】:2014-07-28 20:22:30
【问题描述】:

我是 springBatch 分块的新手。我想了解阅读器的工作原理

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

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

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

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

我正在使用休眠。

【问题讨论】:

    标签: hibernate spring-batch chunking


    【解决方案1】:

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

    几个注意事项:

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

    【讨论】:

    • 感谢您帮助我理解这一点。
    • @MichaelMinella 使用 JdbcPagingItemReader,由于对每个页面再次运行查询,可能会在页面开始之前的位置插入新记录,从而导致上一页的最后一条记录再次处理。这意味着为了防止记录被重新处理,我必须始终手动设置“已处理”标志并在写入之前检查它?
    【解决方案2】:

    分块的工作方式与您提到的不同。

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

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

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

    因此,一旦批处理开始执行,它将继续从数据库中读取可用记录并将记录移交给项目处理器(如果已配置,因为处理器是可选的)。在此之后,数据将汇总在一起。一旦累积了 10 条记录,则将全部 10 条记录馈送到 item writer 写入并提交事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2023-04-07
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多