Spring Batch Step chunkSize和JpaPagingItemReader pageSize如何协同



我正在开发一个Spring Batch应用程序。

虽然我越来越适应它,但我遇到了一些让我非常困惑的事情。

请查看此步骤配置。

@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(和读取器(processNonExportedMbfsOperationsItemReader(有关。

阅读器代码下一个:

@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();
}

阅读器的类型是JpaPagingItemReader,因为我有数千条记录要从DB中提取。

这就是混乱的开始。我希望这个JpaPagingItemReaderBuilder将使用步骤配置中定义的chunk size属性的值,作为JpaPaging ItemReader pageSize属性的值。

但很明显,事实并非如此,我不知道如何理解它

我应该将步长块大小设置为1,将页面大小设置为我想要的值,比如50吗?

我缺少什么?感谢您抽出时间!

在没有处理器的面向区块的步骤中,读取器的页面大小和区块大小之间的差异是

  • 阅读器的页面大小控制每个查询从DB中提取多少项
  • 块大小控制在CCD_ 2方法的一次调用中有多少项被传递给CCD_

这取决于编写器的操作,但1很可能不是一个好的块大小。您可以从将区块大小设置为等于页面大小开始,然后通过尝试和测量不同设置的性能来进行优化。

如果该步骤包含一个处理器,该处理器为某些项目返回null,即丢弃它们,那么它会变得更加复杂。然后,传递给编写器的项目数仅由块大小从上方绑定。原因是块是在块的项目被传递给可能丢弃它们的处理器之前形成的。

还请查看参考文档的这一部分:https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#chunkOrientedProcessing