StoredProcedureItemReader Исключение многопоточности - PullRequest
0 голосов
/ 07 января 2019

Я использую Spring Batch StoredProcedureItemReader, чтобы получить набор результатов и вставить его в другую базу данных, используя JpaItemWriter. Ниже моя конфигурация кода.

@Bean
    public JdbcCursorItemReader jdbcCursorItemReader(){
        JdbcCursorItemReader jdbcCursorItemReader = new JdbcCursorItemReader();
        jdbcCursorItemReader.setSql("call myProcedure");
        jdbcCursorItemReader.setRowMapper(new MyRowMapper());
        jdbcCursorItemReader.setDataSource(myDataSource);
        jdbcCursorItemReader.setFetchSize(50);
        jdbcCursorItemReader.setVerifyCursorPosition(false);
        jdbcCursorItemReader.setSaveState(false);
        return jdbcCursorItemReader;
    }


    @Bean
    public Step step() {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(50);
        threadPoolTaskExecutor.setMaxPoolSize(100);
        threadPoolTaskExecutor.setThreadNamePrefix("My-TaskExecutor ");
        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(Boolean.TRUE);
        threadPoolTaskExecutor.initialize();
        return stepBuilderFactory.get("myJob").transactionManager(secondaryTransactionManager)
                .chunk(50).reader(jdbcCursorItemReader())
                .writer(myJpaItemWriter())
                .taskExecutor(threadPoolTaskExecutor)
                .throttleLimit(100)
                .build();
    }

Код работает нормально без многопоточности или threadpooltaskexecutor. Однако при их использовании я сталкиваюсь с ошибкой ниже.

Caused by: java.sql.SQLDataException: Current position is after the last row
could not execute statement [n/a] com.microsoft.sqlserver.jdbc.SQLServerException: Violation of PRIMARY KEY constraint

Я пытался использовать JdbcCursotItemReader, даже тогда я сталкиваюсь с той же ошибкой. Любые предложения о том, как заставить это работать

1 Ответ

0 голосов
/ 08 января 2019

JdbcCursorItemReader не является потокобезопасным, поскольку основан на ResultSet, который не является потокобезопасным. StoredProcedureItemReader также основан на ResultSet, следовательно, он также не является поточно-ориентированным. Смотри https://stackoverflow.com/a/53964556/5019386

Попробуйте использовать JdbcPagingItemReader, который является поточно-ориентированным или, если вам действительно нужно использовать StoredProcedureItemReader, то сделайте его поточно-ориентированным, поместив его в SynchronizedItemStreamReader.

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

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