我正在使用spring-data-jpa interface CrudRepository
在每日批量导入中保存数据库中的大型数据集。
@Bean
public ItemWriter<MyEntity> jpaItemWriter() {
RepositoryItemWriter<MyEntity> writer = new RepositoryItemWriter<>();
writer.setRepository(repository);
writer.setMethodName("save");
return writer;
}
此接口的默认实现是SimpleJpaRepository
,它提供saveAndFlush()
方法。那个有什么用?如果我运行此方法而不是save()
,这种方法对我来说是否有帮助,例如关于性能?
答案 0 :(得分:8)
一个例子是,如果您使用乐观锁定并希望显式捕获OptimisticLockException并将其抛回客户端。如果更改仅在事务提交时刷新到数据库(即,当您的事务方法返回时),则不能这样做。从事务方法中清除漏洞可以捕获并重新抛出/处理。
来自JPA规范:
3.4.5 OptimisticLockException提供程序实现可以推迟写入数据库,直到事务结束时为止 与锁定模式和冲洗模式设置一致有效。在 在这种情况下,在提交时间之前可能不会发生乐观锁定检查, 并且可以在“之前”抛出OptimisticLockException 完成“提交阶段。如果必须使用OptimisticLockException 被应用程序捕获或处理时,应该使用flush方法 应用程序用来强制数据库写入发生。这个 将允许应用程序捕获并处理乐观锁定 例外
因此,在回答您的问题时,它与性能无关,但可能存在您希望从事务方法中显式刷新数据库的情况。
答案 1 :(得分:3)