【问题标题】:Spring Batch Chunk Processing Commit FrequencySpring Batch Chunk 处理提交频率
【发布时间】:2019-09-01 01:13:08
【问题描述】:

我有一个弹簧批处理步骤,它从文件中读取、处理记录并使用卡盘处理写入文件。该文件预计将有数百万条大记录。我读到 Spring 在将其传递给编写器之前在内存中保存了 [chunk-size] 数量的已处理记录。

为了优化内存使用,我将 [chunk-size] 设置得很小。但是,这会增加该步骤对 BATCH_STEP_EXECUTION 元数据表执行的更新次数,以更新读取和提交计数。

鉴于我正在读取和写入本地文件,对远程数据库服务器的更新相对昂贵。如果我增加 [chunk-size],内存使用量就会增加。

提交频率对于编写本地文件并不重要,因此元数据更新对我来说是个问题。该步骤是可重新启动的,因此从技术上讲,我不需要记录中间提交计数。

我可以只为 JobRepository 使用地图或内存数据库,但我需要保留其他信息,例如开始/结束时间,而且这个问题只针对一个步骤。

是否有任何配置参数可以关闭对作业存储库的中间提交计数更新,或者说更早地将块记录从内存写入存储,仅以块大小/提交频率提交。基本上我正在寻找是否有将块大小与提交频率分开的东西。

【问题讨论】:

  • 您提到使用内存中的作业存储库,这就是您的情况 IMO 的方式。 I am looking if there is something that separates chunk-size from commit-frequency:提交频率取决于块大小和数据源中的项目数。这些是相关的概念,不可能将它们分开。如您所述,块大小值是内存使用量和速度之间的权衡,“最佳”值只能以经验方式确定。希望这会有所帮助。

标签: spring-boot spring-batch


【解决方案1】:

您可以使用作业存储库中的 MapJobRepositoryFactoryBean 直接跳过元数据更新

 <bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
  </bean>

这些答案可能对你有所帮助

BATCH_WITHOUT_PERSISTING_METADATA

SKIP_METADATA_SAVE_SPRING_BATCH

【讨论】:

  • 我相信我已经在我的问题中解决了这个问题“我可以为 JobRepository 使用地图或内存数据库,但我需要保留其他信息,例如开始/结束时间,而且这个问题是仅一步”
  • 好吧,如果你想跟踪这样的事情,那么我认为你需要自己实现它,我不确定 spring batch 是否允许它这样做 - 你可以在您自己的跟踪开始/结束时间持续存在以及您需要什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2017-07-23
  • 2010-11-05
  • 2016-10-18
相关资源
最近更新 更多