我一直在做spring引导批处理工作,从db2as400 sys中提取数据。在游戏结束时,预计要检索到的记录数量是100多万条,但目前我正在处理100000条记录中的一个较小的子集。我配置了一个 JdbcPagingItemReader
用一个 pageSize
40000和 fetchSize
10万。实现这一点的步骤是将数据分块成20000个数据块。当我将logging设置为trace时,我注意到查询是用 FETCH FIRST 40000 ROWS ONLY
,一开始我并不认为这是个问题,直到我注意到这项工作只检索了40000条记录,然后就结束了。我很可能不理解分页应该如何使用spring批处理,但我的假设是spring使用 fetchSize
作为每个查询要检索的总量,然后将其拆分为每个40000页,然后将其分块为每个块20000条记录。我的最终目标是处理所有100000条记录,保持一个高性能条。任何解释分页实际工作原理的帮助都是非常有用的。下面的代码示例。 Spring Boot v2.3.3
Spring Batch Core v4.2.4 Step Bean
@Bean(name = "step-one") public Step stepOne(@Autowired JdbcPagingItemReader<MyPojo> pagingItemReader) { return stepBuilderFactory.get("step-one") .<Product.ProductBuilder, Product>chunk(chunkSize) .reader(pagingItemReader) .processor(itemProcessor) .writer(itemWriter) .taskExecutor(coreTaskExecutor) .listener(chunkListener) .allowStartIfComplete(true) .build(); }
JdbcPagingItemReader Bean
@StepScope @Bean(name = "PagingItemReader") public JdbcPagingItemReader<MyPojo> pagingItemReader(@Autowired PagingQueryProvider queryProvider) { return new JdbcPagingItemReaderBuilder<MyPojo>().name("paging-reader") .dataSource(dataSource) .queryProvider(queryProvider) .rowMapper(mapper) .pageSize(pageSize) .fetchSize(fetchSize) .saveState(false) .build(); }
Properties
```
APPLICATION BATCH CONFIGURATION
application.batch.page-size=40000
application.batch.chunk-size=10000
application.batch.fetch-size=80000
暂无答案!
目前还没有任何答案,快来回答吧!