我在Spring Batch中有一个chunk tasklet . 处理器读取表格A,当记录不存在时,写入者写入表格A.当我将commit-interval配置为1时,它可以正常工作 .
当我将commit-interval配置为更高的数字时,我得到了dublicate entry execptions,因为处理器没有得到脏的读取信息 .
我的Tasklet配置了一个read uncommit语句: batch:transaction-attributes isolation = "READ_UNCOMMITTED"
我认为我的配置中不接受这种配置?有任何想法吗?
2 回答
您不应该遇到此问题,因为读取/进程/写入(通常)以这种方式进行管理:
读取是在单独的连接中完成的
块写入在其自己的事务中完成,用于跳过/重试/故障管理
您不需要使用
READ_UNCOMMITTED
,但更简单:创建
ItemReader<S>
(JdbcCursorItemReader
应该没问题)使用
ItemProcessor<S,T>
处理您的项目编写自己的
ItemWriter<T>
,根据数据库中的存在来编写/更新对象如果要减少要使用自定义编写器写入的项目,可以在处理阶段过滤掉重复的对象:您可以使用映射来实现此目标,以存储@jackson描述的重复项目(仅适用于当前块项目,而不适用于所有行数据库 - 此步骤稍后由
ItemWriter
完成脏读通常是一个可怕的想法 .
听起来这是一个设计问题 .
你应该做的是...... 1)听起来你应该引入一个缓存/映射来存储你计划提交的条目,但还没有写入db .
如果条目已在表A或缓存中,请跳过 . 如果条目不在表A或缓存中,则将副本保存到缓存中,并将其添加到写入者要写入的候选列表中 .