War*_*mix 3 java orm spring jpa spring-data-jpa
我想问一下 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);
}
Run Code Online (Sandbox Code Playgroud)
这只是一个示例,但所有内容都必须保持在其位置(例如创建示例列表,然后使用 saveAll、使用级联等。这是不允许的)。
我观察到了什么?前 2000 个对象的保存速度非常快 - 比方说:10 分钟。但是 - 接下来的 2000 个被保存的时间要长得多,大约 30 分钟。这是为什么?为什么保存每个后续的时间需要更长的时间?如果我使用 JpaRepository 和 saveAndFlush() 会怎么样?如果我使用 saveAndFlush() 会缩短这个过程吗?
当您点击save()与 等效的时entityManager.persist(),持久性提供程序不会INSERT在物理数据库上隐式执行 。它只是将给定实体存储在其持久性上下文中。它已在当前会话缓存(一级缓存)中进行管理。
这是为了防止不必要的CRUD操作过载。默认情况下,更改会在当前事务提交时刷新(或者在达到托管实体的特定阈值(如您的情况)时)。SELECT当在事务期间执行包含持久化实体的操作时,也可能会触发隐式刷新JOINs(但这里不是这种情况)。
当您使用 时flush,持久性提供者有义务在此时对数据库执行物理保存。
但它会提高性能吗?这个问题没有明确的答案,这完全取决于每个独特的场景。但这是一个选项,您需要执行一组测试才能找到答案。
你也可以摆弄hibernate.jdbc.batch_size. 如果您根据自己的特定情况选择正确的配置,您可能会受益匪浅。
| 归档时间: |
|
| 查看次数: |
6024 次 |
| 最近记录: |