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