java - 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 我们究竟需要如何禁用它?
解决方案
JdbcCursorItemReader
extendsAbstractItemCountingItemStreamItemReader
不是线程安全的。您可以尝试同步其read
操作(通过用 装饰它SynchronizedItemStreamReader
),否则您需要使用像JdbcPagingItemReader
.
推荐阅读
- php - 引导模式没有获取用户 ID
- python-3.x - Chrome 驱动程序错误 selenium 消息:会话未从断开连接创建:无法连接到渲染器
- javascript - Discord.js 显示状态中的禁令数量
- php - ffmpeg 命令无法正确捕获移动视频图像。总是得到拉伸图像
- java - 我正在尝试在 java 中使用 CertAndKeyGen 我尝试导入 sun.security.x509.CertAndKeyGen.ALL sun 包库显示错误
- android-ndk - SENSOR_FRAME_DURATION 未更改为 1/60
- c++ - 为什么在运行时而不是在编译时使用 constexpr 初始化变量
- sonos - 播放 Sonos Group 中播放列表的特定曲目
- android - 有没有办法检测我的 Android TV 遥控器是否有麦克风?
- audio - 使用 ffmpeg 对 mkv 进行缩减、色调映射、缩混和重新编码