首页 > 解决方案 > Spring批处理 - 使用块和多线程使用taskexecutor读取和写入数据库

问题描述

我的代码能够读取和写入数据库,但在此过程停止之后只有一个块。无法执行其他块。

这里的错误看起来像 org.springframework.dao.InvalidDataAccessResourceUsageException: Unexpected cursor position change。

步骤实施

@Bean
    public Step step(StepBuilderFactory stepBuilderFactory) throws Exception {
       ThreadPoolTaskExceutor taskExcutorInstance = new ThreadPoolTaskExceutor();
       taskExcutorInstance.setCorePoolSize(10);
       taskExcutorInstance.setMaxPoolSize(10);

       return stepBuilderFactory
                .get("read from DB and Write to DB")
                .<Object, Object>chunk(1000)
                .reader(reader(null))
                .writer(writer())
                .taskExecutor(taskExcutorInstance)
                .build();
    }

对于使用 JdbcCursorItemReader 的阅读器和使用 JdbcbatchItemWriter 的编写器。我正在尝试同时读取和写入多个块

如果我需要禁用 verifyCursorPosition 我们究竟需要如何禁用它?

标签: javamultithreadingjdbcspring-batchbatch-processing

解决方案


JdbcCursorItemReaderextendsAbstractItemCountingItemStreamItemReader不是线程安全的。您可以尝试同步其read操作(通过用 装饰它SynchronizedItemStreamReader),否则您需要使用像JdbcPagingItemReader.


推荐阅读