sql-server-2012 - SpringBatch(JdbcPagingItemReader) 不获取所有行
问题描述
我有一个 springbatch 应用程序,但无法使用 JdbcPagingItemReader 获取所有行。
总行数:
select count(*) from web_view;
结果为 12057 行。
datasource.chunk.size=500
@Bean
public PagingQueryProvider pagingQueryProvider() {
SqlServerPagingQueryProvider sqlServerPagingQueryProvider = new SqlServerPagingQueryProvider();
Map<String, Order> sortKey = new HashMap<>();
sortKey.put("type", Order.ASCENDING);
sqlServerPagingQueryProvider.setSelectClause("select *");
sqlServerPagingQueryProvider.setFromClause("from web_view");
sqlServerPagingQueryProvider.setSortKeys(sortKey);
return sqlServerPagingQueryProvider;
}
@Bean
public JdbcPagingItemReader<Web> jdbcPagingItemReader() throws Exception {
return new JdbcPagingItemReaderBuilder<Web>()
.name("jdbcPagingItemReader")
.dataSource(dataSource())
.queryProvider(pagingQueryProvider())
.rowMapper(new BeanPropertyRowMapper<>(Web.class))
.pageSize(chunkSize)
.saveState(true)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener jobCompletionNotificationListener, Step step1) {
return jobBuilderFactory.get("migrateWebJob")
.incrementer(new RunIdIncrementer())
.listener(jobCompletionNotificationListener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory.get("step1")
.<Web, WebStore>chunk(chunkSize)
.reader(jdbcPagingItemReader())
.processor(webStoreItemProcessor())
.writer(eventHubItemWriter())
.build();
}
它在第 3 次分页后优雅地停止,仅处理 12057 行中的 1500 行。
解决方案
字段键类型的提取工作。
OraclePagingQueryProvider queryProvider = new OraclePagingQueryProvider();
queryProvider.setSelectClause("*");
queryProvider.setFromClause("from MEMENTO_REQUEST");
Map<String, Order> sortKeys = new HashMap<>(1);
sortKeys.put("PROG_REQUEST_ID", Order.ASCENDING);
如果您对不是 PK 的字段进行排序,则获取比表中的所有记录次要