JdbcPagingItemReader не может прочитать все данные - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь прочитать данные из oracle БД и записать данные в postgresql БД.

При приведенной ниже конфигурации только 250 записей читаются и записываются в БД, в то время как в источнике содержится более 100 000 записей. DB. Что я делаю не так?

Я использую Spring Boot-2.2.5 и Spring Batch.

Еще одна вещь, которую я заметил, это то, что

if chunk/page size = 500 , 250 records are read
if chunk/page size = 1000 , 500 records are read
if chunk/page size = 2500 , 1250 records are read

Конфигурация как показано ниже:

@Bean
Job job() throws Exception {
    return jobBuilderFactory.get("importJob")
            .incrementer(new RunIdIncrementer())
            .flow(importPersonDetails())
            .end()
            .build();
}


Step importPersonDetails() throws Exception {
    return this.stepBuilderFactory.get("importPersonDetails")
            .<Person, Person>chunk(500)
            .reader(personPagingItemReader())
            .writer(personWriter())
            .listener(new StepListener())
            .build();
}

JdbcPagingItemReader<Person> personPagingItemReader() throws Exception {

            OraclePagingQueryProvider oraclePagingQueryProvider = new OraclePagingQueryProvider();
            oraclePagingQueryProvider.setSelectClause("id,first_name,last_name,birth_date");
            oraclePagingQueryProvider.setFromClause("person_details");
            oraclePagingQueryProvider.setWhereClause("is_alive='Y'");

            Map<String, Order> sortKeys = new HashMap<>(1);
            sortKeys.put("id",Order.ASCENDING);

            oraclePagingQueryProvider.setSortKeys(sortKeys);

            JdbcPagingItemReader<Person> personJdbcPagingItemReader = new JdbcPagingItemReader<>();
            personJdbcPagingItemReader.setDataSource(sourceDatasource);
            personJdbcPagingItemReader.setPageSize(500);
                            personJdbcPagingItemReader.setQueryProvider(oraclePagingQueryProvider);
            personJdbcPagingItemReader.setRowMapper(new PersonRowMapper());
            personJdbcPagingItemReader.afterPropertiesSet();

            return personJdbcPagingItemReader;
    }

    JdbcBatchItemWriter<Person> personWriter() {
        JdbcBatchItemWriter<Person> personJdbcBatchItemWriter = new JdbcBatchItemWriter<>();
        personJdbcBatchItemWriter.setDataSource(targetDatasource);
        personJdbcBatchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
        personJdbcBatchItemWriter.setSql(QUERY_INSERT_PERSONS);
        personJdbcBatchItemWriter.afterPropertiesSet();
        return personJdbcBatchItemWriter;
    }

1 Ответ

0 голосов
/ 03 мая 2020

Ваша конфигурация кажется правильной, возможно, если бы вы могли поделиться большим количеством кода, было бы полезно предоставить вам больше информации.

Одной вещью, которую я подозреваю, кроме этой распределенной транзакции, является ваш RowMapper. Возможно, вы вызываете метод ResultSet next () для каждой строки, что заставляет вашего читателя всегда переходить к следующей строке в resultSet.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...