2015-03-31 60 views
0

我正在使用Spring批处理JDBCCursorItemReader从表中读取数据集。一旦数据被读取,spring批处理将处理块(读取器,处理器,写入器)中的每一行。现在我想更新/删除读者提取的那些记录,以避免同一作业的另一个实例进行再处理。有人可以告诉我,我怎么能在读者中做到这一点?是否有可能在jdbccursoritemreader数据库中更新

感谢

+2

你不这样做在读者,这只是为了阅读......你想在你的作家也许是一个自定义的块侦听器做到这一点。 – 2015-03-31 10:09:47

+0

但是我想在读取器读取这些记录时立即更新/删除,而不是在处理之后,因为写入器只有在处理后才能执行,我可以使用这种写入器吗? – springbatcher 2015-03-31 10:38:21

+0

当操作失败时你打算做什么?您的记录已被标记为已处理,而不是......那么是什么?此外,它只会在事务提交后才可见,并且您不希望为每条记录创建一个事务,因为这会损害您的性能。不允许多个工作实例更容易解决? – 2015-03-31 10:52:55

回答

0

就像已经指出,这可能是一个糟糕的设计主意。但是,如果你知道这是你想要做什么,

创建两步工作,
步骤,以提交间隔为1
读取记录
写与当前任务执行ID
更新的记录 步骤b
阅读其中作业执行id是需要当前作业执行ID
过程和更新记录

  1. 我不推荐这种做法在评论
  2. 一个提交的1间隔将杀了你陈述的理由性能,如果使用过应该是唯一的一个小体积的工作明智所以这种方式。
+0

无法理解你的意思是2步骤过程?我想更新那些由我的itemreader获取的记录,只要第一次itemreader被执行就处理,就不会被其他实例选中。就像当我执行'select * from tablea where status ='not processed''时,会给出100行(所有这些行都需要在开始处理之前更新为处理),同时如果有100行更多的行插入到tablea中status =“not processed”表的第二个实例应该只选择100条记录,而不是第一个实例仍在运行时的200或100+。 – springbatcher 2015-04-01 08:34:52

+0

我明白你在找什么。你可以**不**在可用的项目作家。你将需要写一个客户项目作家。 或 你可以写2步骤的工作。 作业中的步骤1读取记录并将记录标记为已读取进行处理。 第2步只读取那些被标记为可以处理的记录,然后处理这些记录 – 2015-04-01 18:52:19

相关问题