SpringBatch (JdbcPagingItemReader) не выбирает все строки - PullRequest
0 голосов
/ 20 марта 2019

У меня есть приложение Springbatch, и у меня возникают проблемы с извлечением всех строк с использованием JdbcPagingItemReader.

Всего строк - выберите количество (*) из 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-й обработки подкачки только 1500 строк из 12057.

1 Ответ

0 голосов
/ 21 марта 2019

Ниже найден обходной путь, который я нашел.Ключ сортировки, который я использовал, «type» имел 3 разных записи.Я не уверен, было ли это проблемой.Я добавил дополнительный столбец идентификаторов в свое представление и добавил это (row_num) к ключу сортировки, который решил проблему.

Exp:

create or alter view my_view as
select *, row_number() over (order by (select 1)) row_num
from (select * from tab1
union
select * from tab2
union
select * from tab3)x;


@Bean
    public PagingQueryProvider pagingQueryProvider() throws Exception {
        SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
        Map<String, Order> sortKey = new HashMap<>();
        sortKey.put("row_num", Order.ASCENDING);
        sqlPagingQueryProviderFactoryBean.setDataSource(dataSource());
        sqlPagingQueryProviderFactoryBean.setSelectClause("select *");
        sqlPagingQueryProviderFactoryBean.setFromClause("from dse.zyntrack_web_view");
        sqlPagingQueryProviderFactoryBean.setSortKeys(sortKey);
        return sqlPagingQueryProviderFactoryBean.getObject();
    }
...