我是Spring批次的新手,我有几个问题。
问题1:我正在使用MultiResourceItemReader读取一堆CSV文件和一个JDBC Item writer来批量更新数据库。提交间隔设置为1000.如果有一个包含10k记录的文件,并且我在第7批遇到DB错误,有什么办法可以回滚所有以前提交的块吗?
问题2:如果有两个文件,每个文件有100条记录,并且提交间隔设置为1000,那么MultiResourceItemReader将读取这两个文件并将其发送给Writer。有没有办法我们可以一次只写一个文件而忽略提交间隔,在这种情况下基本上只在编写器中创建一个循环?
答案 0 :(得分:0)
问题1 :实现这一目标的唯一方法是通过某种形式的补偿逻辑。你可以通过监听器(例如ChunkListener#afterChunkError
)来做到这一点,但实现取决于你。 Spring Batch中没有任何内容可以知道输出的整体状态以及如何将其回滚到当前事务之外。
问题2 :假设您正在为每个输入文件查找一个输出文件,由于大多数Resource
实现都是非事务性的,因此与它们关联的编写器会特殊工作缓冲到提交点,然后刷新。这里的问题是,因此,没有真正的机会将缓冲区划分为多个资源。要明确,可以这样做,您只需要自定义ItemWriter
即可。