Spring Batch Step chunkSize 和 JpaPagingItemReader pageSize 如何协同工作
How Spring Batch Step chunkSize and JpaPagingItemReader pageSize work together
我正在开发 Spring 批处理应用程序。
虽然我越来越适应它,但我遇到了一些让我非常困惑的事情。
请看一下这一步配置。
@Bean
@Qualifier(value = "processNonExportedMbfsOperationsStep")
public Step processNonExportedMbfsOperationsStep() {
return stepBuilderFactory
.get("processNonExportedMbfsOperationsStep")
.allowStartIfComplete(false)
.<MbfsEntity, CsvOutputLineDto>chunk(Integer.parseInt(chunkSize))
.reader(processNonExportedMbfsOperationsItemReader)
.processor(processNonExportedMbfsOperationItemProcessor)
.writer(processNonExportedMbfsOperationsCompositeItemWriter)
.faultTolerant()
.retry(DataAccessException.class)
.retryLimit(3)
.build();
}
如您所见,这是一个非常标准的步骤。
我的困惑与块大小 (50) 和 reader (processNonExportedMbfsOperationsItemReader) 有关。
Reader 下一个代码:
@PersistenceContext
@Qualifier(value = "mbfsEntityManager")
private EntityManager mbfsEntityManager;
@Bean
public JpaPagingItemReader<MbfsEntity> processNonExportedMbfsOperationsItemReader() {
JpaNativeQueryProvider<MbfsEntity> queryProvider = new JpaNativeQueryProvider<>();
queryProvider.setSqlQuery(buildQuery());
queryProvider.setEntityClass(MbfsEntity.class);
return new JpaPagingItemReaderBuilder<MbfsEntity>()
.name("processNonExportedMbfsOperationsItemReader")
.entityManagerFactory(mbfsEntityManager.getEntityManagerFactory())
.pageSize(Integer.parseInt(chunkSize))
.queryProvider(queryProvider)
.build();
}
reader 是 JpaPagingItemReader 类型,因为我有数千条记录要从数据库中获取。
所以这就是混乱的开始。我希望这个 JpaPagingItemReaderBuilder 会使用步骤配置中定义的块大小 属性 的值作为 JpaPagingItemReader pageSize 属性 的值。
但显然不是这样,我也不知道怎么理解。
我是否应该将步长块大小设置为 1,并将页面大小设置为我想要的值,例如 50?
我错过了什么?
感谢您的宝贵时间!
在没有处理器的 chunk-oriented 步骤中,reader 的页面大小与块大小之间的差异是
- reader 的页面大小控制每个查询从数据库中获取的项目数,
- 块大小控制在一次调用
write
方法时将多少项目传递给 Writer
。
这取决于您编写的内容,但 1 很可能不是一个好的块大小。您可以从将块大小设置为等于页面大小开始,然后通过尝试和测量不同设置的性能来进行优化。
如果该步骤包含 returns null
某些项目的处理器,即丢弃它们,那么它会变得更加复杂。然后,传递给编写器的项目数仅受块大小的约束。原因是块是在块的项目传递给可能丢弃它们的处理器之前形成的。
另请查看参考文档的这一部分:https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#chunkOrientedProcessing
我正在开发 Spring 批处理应用程序。
虽然我越来越适应它,但我遇到了一些让我非常困惑的事情。
请看一下这一步配置。
@Bean
@Qualifier(value = "processNonExportedMbfsOperationsStep")
public Step processNonExportedMbfsOperationsStep() {
return stepBuilderFactory
.get("processNonExportedMbfsOperationsStep")
.allowStartIfComplete(false)
.<MbfsEntity, CsvOutputLineDto>chunk(Integer.parseInt(chunkSize))
.reader(processNonExportedMbfsOperationsItemReader)
.processor(processNonExportedMbfsOperationItemProcessor)
.writer(processNonExportedMbfsOperationsCompositeItemWriter)
.faultTolerant()
.retry(DataAccessException.class)
.retryLimit(3)
.build();
}
如您所见,这是一个非常标准的步骤。
我的困惑与块大小 (50) 和 reader (processNonExportedMbfsOperationsItemReader) 有关。
Reader 下一个代码:
@PersistenceContext
@Qualifier(value = "mbfsEntityManager")
private EntityManager mbfsEntityManager;
@Bean
public JpaPagingItemReader<MbfsEntity> processNonExportedMbfsOperationsItemReader() {
JpaNativeQueryProvider<MbfsEntity> queryProvider = new JpaNativeQueryProvider<>();
queryProvider.setSqlQuery(buildQuery());
queryProvider.setEntityClass(MbfsEntity.class);
return new JpaPagingItemReaderBuilder<MbfsEntity>()
.name("processNonExportedMbfsOperationsItemReader")
.entityManagerFactory(mbfsEntityManager.getEntityManagerFactory())
.pageSize(Integer.parseInt(chunkSize))
.queryProvider(queryProvider)
.build();
}
reader 是 JpaPagingItemReader 类型,因为我有数千条记录要从数据库中获取。
所以这就是混乱的开始。我希望这个 JpaPagingItemReaderBuilder 会使用步骤配置中定义的块大小 属性 的值作为 JpaPagingItemReader pageSize 属性 的值。
但显然不是这样,我也不知道怎么理解。
我是否应该将步长块大小设置为 1,并将页面大小设置为我想要的值,例如 50?
我错过了什么? 感谢您的宝贵时间!
在没有处理器的 chunk-oriented 步骤中,reader 的页面大小与块大小之间的差异是
- reader 的页面大小控制每个查询从数据库中获取的项目数,
- 块大小控制在一次调用
write
方法时将多少项目传递给Writer
。
这取决于您编写的内容,但 1 很可能不是一个好的块大小。您可以从将块大小设置为等于页面大小开始,然后通过尝试和测量不同设置的性能来进行优化。
如果该步骤包含 returns null
某些项目的处理器,即丢弃它们,那么它会变得更加复杂。然后,传递给编写器的项目数仅受块大小的约束。原因是块是在块的项目传递给可能丢弃它们的处理器之前形成的。
另请查看参考文档的这一部分:https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#chunkOrientedProcessing