Spring boot Spring批处理块处理提交频率

Spring boot Spring批处理块处理提交频率,spring-boot,spring-batch,Spring Boot,Spring Batch,我有一个spring批处理步骤,它使用chuck处理从文件读取、处理记录并写入文件。该文件预计将有数百万条大型记录。我读到Spring在将其传递给编写器之前,在内存中保存了[chunk size]数量的已处理记录 为了优化内存使用,我将[chunk size]保持得很小。但是,这会增加该步骤对BATCH_step_EXECUTION元数据表的更新次数,以更新读取和提交计数 鉴于我正在读写本地文件,对远程数据库服务器的更新相对昂贵。如果我增加[chunk size],内存使用就会增加 提交频率对编

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

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

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

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

我可以只为JobRepository使用一个映射或内存数据库,但我需要其他信息,如持续的开始/结束时间,而且这个问题只针对单个步骤


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

您可以在作业repositoryFactoryBean中使用MapJobRepositoryFactoryBean直接跳过元数据更新

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

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


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

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

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


我相信我已经在我的问题中解决了这个问题,“我可以使用一个map或内存数据库作为JobRepository,但我需要其他信息,例如持续的开始/结束时间,而且这个问题只涉及一个步骤”如果你想跟踪类似的事情,那么我认为你需要自己实现它,我不确定SpringBatch是否允许这样做-您可以自己实施一些审计步骤来跟踪持续的开始/结束时间以及您需要的任何东西我相信我在我的问题中已经解决了这一点“我可以只使用一个映射或内存中的数据库作为JobRepository,但我需要其他信息,如持续的开始/结束时间,而且这个问题只针对单个步骤“好吧,如果你想跟踪这样的事情,那么我认为你需要自己实现它,我不确定spring batch是否允许这样做-你可以自己实现一些审计步骤来跟踪持续的开始/结束时间,以及你提到的使用内存作业存储库的任何需要,在您的案例中,我就是这么做的。
我正在寻找是否有什么东西可以将块大小与提交频率区分开来
:提交频率取决于块大小和数据源中的项目数。这些都是相关概念,不可能将它们分开。如您所述,块大小值是内存使用率和速度之间的折衷,而“最佳”值只能通过经验方式确定。希望这会有所帮助。您提到使用内存中的作业存储库,这是您的案例IMO中的方法。
我正在查看是否存在将块大小与提交频率分开的内容。
:提交频率取决于块大小和数据源中的项目数。这些都是相关概念,不可能将它们分开。如您所述,块大小值是内存使用率和速度之间的折衷,而“最佳”值只能通过经验方式确定。希望这有帮助。