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