首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StoredProcedureItemReader MultiThreading异常

StoredProcedureItemReader MultiThreading异常
EN

Stack Overflow用户
提问于 2019-01-07 22:00:19
回答 1查看 151关注 0票数 0

我使用Spring Batch StoredProcedureItemReader来检索结果集,并使用JpaItemWriter将其插入到另一个数据库中。下面是我的代码配置。

代码语言:javascript
复制
@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.However的情况下运行良好,在使用它们时,我遇到了下面的错误。

代码语言:javascript
复制
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,但我仍然面临着同样的error.Any建议,告诉我如何实现这一点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-08 05:12:51

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

尝试使用is thread-safeJdbcPagingItemReader,或者如果您真的必须使用StoredProcedureItemReader,则通过将其包装在SynchronizedItemStreamReader中来使其线程安全。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54075846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档