【问题标题】:When to use saveAndFlush in springs SimpleJpaRepository?何时在 Springs SimpleJpaRepository 中使用 saveAndFlush?
【发布时间】:2015-02-09 20:51:48
【问题描述】:

我正在使用 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(),这个方法对我有什么帮助吗,例如关于性能?

【问题讨论】:

    标签: java spring jpa spring-data spring-data-jpa


    【解决方案1】:

    根据Spring Data's JavadocsaveAndFlush

    保存实体并立即刷新更改。

    如果您使用save 方法,它会在底层事务提交时刷新更改。

    【讨论】:

      【解决方案2】:

      一个例子是,如果您正在使用 Optimistic Locking 并希望显式捕获 OptimisticLockException 并将其扔回客户端。如果更改仅在事务提交时刷新到数据库(即当您的事务方法返回时),那么您不能这样做。从事务方法中进行显式刷新允许您捕获并重新抛出/处理。

      来自 JPA 规范:

      3.4.5 OptimisticLockException Provider 实现可能会将写入数据库推迟到事务结束,此时 与有效的锁定模式和刷新模式设置一致。在 在这种情况下,直到提交时间才会发生乐观锁检查, 并且 OptimisticLockException 可能会在“之前 完成”阶段的提交。如果 OptimisticLockException 必须 被应用程序捕获或处理,flush方法应该是 应用程序用来强制数据库写入发生。这 将允许应用程序捕获和处理乐观锁 例外

      因此,在回答您的问题时,它与性能无关,但在某些情况下,您可能希望从事务方法中显式刷新到数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 2019-05-20
        • 2021-06-16
        • 1970-01-01
        相关资源
        最近更新 更多