我正在使用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,即使那样我也遇到相同的错误。关于如何使这项工作有效的任何建议
答案 0 :(得分:1)
JdbcCursorItemReader
不是线程安全的,因为它基于ResultSet
而不是线程安全的。 StoredProcedureItemReader
也基于ResultSet
,因此它也不是线程安全的。参见https://stackoverflow.com/a/53964556/5019386
尝试使用is thread-safe中的JdbcPagingItemReader
,或者如果您确实需要使用StoredProcedureItemReader
,则可以通过将其包装在SynchronizedItemStreamReader
中来使其具有线程安全性。 / p>
希望这会有所帮助。