gpt4 book ai didi

java - save() 性能 - saveAndFlush() 会更好吗?

转载 作者:行者123 更新时间:2023-12-02 01:23:08 24 4
gpt4 key购买 nike

我想问一下CrudRepository中save()的性能。首先是一个代码示例。

for(int i=0; i<5000; i++){
Example example = new Example(0, true, false, i, "example");
example = exampleRepository.save(example);
List<ChildExample> childExamples = new ArrayList<>();
ChildExample childExample = new ChildExample(0, i, true, example);
childExamples.add(childExample);
childExampleRepository.saveAll(childExamples);
}

这只是一个示例,但所有内容都必须保持在其位置(例如创建示例列表,然后使用 saveAll、使用级联等。这是不允许的)。

我观察到了什么?前 2000 个对象的保存速度非常快 - 比方说:10 分钟。但是 - 接下来的 2000 个被保存的时间要长得多,大约 30 分钟。这是为什么?为什么保存每个后续的时间需要更长的时间?如果我使用 JpaRepository 和 saveAndFlush() 会怎样?如果我使用 saveAndFlush() 会缩短这个过程吗?

最佳答案

当您点击save()(相当于entityManager.persist())时,持久性提供程序不会隐式执行INSERT在物理数据库上。它只是将给定实体存储在其持久性上下文中。它已在当前 session 缓存(一级缓存)中进行管理。

这是为了防止不必要的 CRUD 操作过载。默认情况下,更改会在当前事务提交时刷新(或者在达到托管实体的特定阈值(如您的情况)时)。当在事务期间执行SELECT操作时,也可能会触发隐式刷新,该事务包含JOIN中某处的持久实体(但这里不是这种情况)。

当您使用flush时,持久性提供者有义务在此时对数据库执行物理保存。

但是它会提高性能吗?这个问题没有明确的答案,这完全取决于每个独特的场景。不过,这是一个选项,您需要执行一组测试才能找到答案。

您还可以摆弄hibernate.jdbc.batch_size。如果您针对特定情况使用正确的此配置,您可能会受益匪浅。

关于java - save() 性能 - saveAndFlush() 会更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com