Spring batch Spring批处理:JdbcPagingItemReader分页

Spring batch Spring批处理:JdbcPagingItemReader分页,spring-batch,reader,Spring Batch,Reader,我在做一个简单的批处理时遇到了一个问题,该批处理从postgresql数据库读取数据,并在csv文件中进行处理和写入。以下是读者: @Bean @StepScope public ItemReader<SearchResult> databaseReader(@Qualifier("reportingDataSource") HikariDataSource reportDataSource, @

我在做一个简单的批处理时遇到了一个问题,该批处理从postgresql数据库读取数据,并在csv文件中进行处理和写入。以下是读者:

 @Bean
@StepScope
public ItemReader<SearchResult> databaseReader(@Qualifier("reportingDataSource") HikariDataSource reportDataSource,
                                           @Value("#{stepExecution}") StepExecution stepExecution) {

    JdbcPagingItemReader<SearchResult> reader = new JdbcPagingItemReader<>();
    reader.setQueryProvider(createQueryProvider());
    reader.setRowMapper(new CustomRowMapper());
    reader.setDataSource(reportDataSource);
    reader.setPageSize(5);
    reader.open(stepExecution.getExecutionContext());
    return reader;
}

private PagingQueryProvider createQueryProvider(SearchTxnRequest searchTxnRequest) {
    SqlitePagingQueryProvider queryProvider = new SqlitePagingQueryProvider();
    queryProvider.setSelectClause("SELECT *");
    queryProvider.setFromClause("from dummy_table");
    queryProvider.setSortKeys(sortBy());
    return queryProvider;
}

private Map<String, Order> sortBy() {
    Map<String, Order> sortConfiguration = new HashMap<>();
    sortConfiguration.put("date", Order.ASCENDING);
    return sortConfiguration;
}
第二页:

2020-03-30 15:01:40 [nio-7035-exec-1] o.s.b.i.database.JdbcPagingItemReader    : Reading page 1
2020-03-30 15:01:40 [nio-7035-exec-1] o.s.b.i.database.JdbcPagingItemReader    : SQL used for reading remaining pages: [SELECT * FROM from dummy_table WHERE ((date > ?)) ORDER BY date ASC LIMIT 5]

如您所见,分页是由日期排序键进行的。我的问题是表中的所有数据都有相同的日期。明智地选择排序键以避免分页中出现问题,这一点很重要。我添加了ID,这就解决了问题。

您不需要调用
阅读器。在
数据库阅读器
方法中打开
,如果您的阅读器声明为
ItemStreamReader
,Spring Batch将执行此操作。我建议返回读写器bean定义中最具体的类型,以便springbatch能够正确地创建代理。在您的情况下,应该是这样的:

@Bean
@StepScope
public JdbcPagingItemReader<SearchResult> databaseReader(@Qualifier("reportingDataSource") HikariDataSource reportDataSource) {

   JdbcPagingItemReader<SearchResult> reader = new JdbcPagingItemReader<>();
   reader.setQueryProvider(createQueryProvider());
   reader.setRowMapper(new CustomRowMapper());
   reader.setDataSource(reportDataSource);
   reader.setPageSize(5);
   return reader;
}

我相信您的日期列不是键,这就是为什么在添加ID时,它会起作用。

您不需要调用
reader。在
databaseReader
方法中打开
,如果您的reader被声明为
ItemStreamReader
,Spring Batch将执行此操作。我建议返回读写器bean定义中最具体的类型,以便springbatch能够正确地创建代理。在您的情况下,应该是这样的:

@Bean
@StepScope
public JdbcPagingItemReader<SearchResult> databaseReader(@Qualifier("reportingDataSource") HikariDataSource reportDataSource) {

   JdbcPagingItemReader<SearchResult> reader = new JdbcPagingItemReader<>();
   reader.setQueryProvider(createQueryProvider());
   reader.setRowMapper(new CustomRowMapper());
   reader.setDataSource(reportDataSource);
   reader.setPageSize(5);
   return reader;
}
我相信你的日期栏不是一个键,这就是为什么当你添加ID时,它会起作用

It is important to have a unique key constraint on the sort key

The columns that make up the sort key must be a true key and not just a column to order by