StoredProcedureItemReader MultiThreading异常

时间:2019-01-07 14:00:19

标签: multithreading spring-batch

我正在使用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 :(得分:1)

JdbcCursorItemReader不是线程安全的,因为它基于ResultSet而不是线程安全的。 StoredProcedureItemReader也基于ResultSet,因此它也不是线程安全的。参见https://stackoverflow.com/a/53964556/5019386

尝试使用is thread-safe中的JdbcPagingItemReader,或者如果您确实需要使用StoredProcedureItemReader,则可以通过将其包装在SynchronizedItemStreamReader中来使其具有线程安全性。 / p>

希望这会有所帮助。