Spring Batch SkipListener的onSkipInWrite方法在Oracle环境下异常多次触发的问题求助
Spring Batch SkipListener的onSkipInWrite方法在Oracle环境下异常多次触发的问题求助
大家好,我最近在做Spring Batch开发时碰到了一个特别费解的问题,想过来求助一下各位同行:
我有一个Spring Batch作业,里面只包含一个Step,并且实现了SkipListener接口来处理跳过的记录。
问题描述
核心问题是:当ItemWriter以chunk为单位往Oracle数据库插入数据时,如果某一条插入触发了错误(比如违反主键约束这类完整性错误),SkipListener中的onSkipInWrite方法会被多次调用,每次传入不同的“疑似错误记录”,但实际上数据库里只有那条真正有问题的记录被跳过了,其他记录都正常插入成功了。
具体测试用例
我整理了两个实际测试场景,能更直观地展示这个异常现象:
第一个用例
- 操作:ItemWriter往Oracle表中插入主键为1、2、3、4、5、6、7、7、8、9的记录(其中主键7被重复插入,这会触发主键约束错误)
- 现象:SkipListener的
onSkipInWrite方法被分别针对7、2、3、4、9这些记录触发,但去数据库查询后发现,只有主键7的记录被跳过了,2、3、4、9都正常插入成功了
第二个用例
- 操作:ItemWriter往Oracle表中插入主键为1、2、3、4、5、6、7、8、9的记录(所有主键唯一,无冲突)
- 现象:SkipListener的
onSkipInWrite方法完全没有被触发,这符合预期
我现在完全搞不懂为什么会出现这种“误触发”的情况,明明很多记录已经成功插入了,却被当成跳过的记录通知给了Listener。有没有大佬遇到过类似的问题,或者能给我一些排查的方向呀?
备注:内容来源于stack exchange,提问作者IntegraleOne
相关产品推荐
相关产品推荐

