Возникла проблема, когда я делал простой пакет, который считывает данные из базы данных 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;
}
Я вставил фиктивные данные в 'dummy_table' с другим идентификатором, но такими же данными в других полях, включая поле даты. Как видно из кода, функция sortBy определяет способ сортировки информации в таблице, я выбрал только поле даты. Проблема возникает здесь, если все строки в таблице имеют одинаковую дату, пакет возвращает только первые 5 строк (если размер страницы 5).
Почему? ну, JdbcPagingItemReader разбивает на страницы с ключами сортировки, в данном случае только с датой. Отладка показывает следующее: Итак, первая страница читается
2020-03-30 15:01:40 DEBUG [nio-7035-exec-1] o.s.b.i.database.JdbcPagingItemReader : Reading page 0
2020-03-30 15:01:40 DEBUG [nio-7035-exec-1] o.s.b.i.database.JdbcPagingItemReader : SQL used for reading first page: [SELECT * FROM from dummy_table ORDER BY date ASC LIMIT 5]
Вторая страница:
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]
Как видно, разбиение на страницы производится с помощью ключа сортировки по дате. Моя проблема заключалась в том, что все данные в таблице имели одинаковую дату. Важно правильно выбрать ключ сортировки, чтобы избежать проблем с нумерацией страниц. Я добавил идентификатор, и это решило проблему.