在我的spring boot应用程序中,我正在尝试进行批量插入,以提高写入性能。问题是我经常得到重复的数据,对于这些重复数据,我的表有几个唯一的约束。在执行串行插入时,我只是捕获DataIntegrityException并忽略它们。但在执行批插入时,即使只有一次插入失败,也不会保存整个批。我希望hibernate仍然保存不抛出错误的记录。我使用repository.saveAll()进行插入,我的数据库是Mysql
发布于 2021-06-25 03:30:20
在批处理过程中,您需要添加
.faultTolerant()
.skipPolicy(new AlwaysSkipItemSkipPolicy())在编写器之后的步骤中。例如,在我的步骤中,我将其配置如下
@Bean
public Step step1(){
return steps.get("step1")
.<Product,Product>chunk(3)
.reader(reader(null))
.processor(new ProductProcessor())
.writer(flatFileItemWriter(null))
// .writer(xmlWriter(null))
// .writer(dbWriter())
// .writer(dbWriter2())
.faultTolerant()
.skipPolicy(new AlwaysSkipItemSkipPolicy())
.listener(new ProductSkipListener())
.build();
}这只能完成一半的工作,因为您还希望在最后看到无法添加的记录。为此,您需要添加侦听器,它基本上实现了如何处理对象尚未写入数据库的情况的逻辑。
发布于 2021-07-01 02:09:23
这不可能。在发生异常后,Hibernate的内部结构就不再工作了。您必须捕获异常并在新的事务/实体管理器中重试您的操作。
https://stackoverflow.com/questions/68118046
复制相似问题