Spring data 保存 saveAll 表现

我正试图了解原因 saveAll 具有比存储库中的更好的性能 Spring Data. 我用
CrudRepository

, 可以看到哪个
https://docs.spring.io/spring- ... .html
.

用于测试,我创建并添加到列表中 10 千实体只有标识符和随机字符串 /对于benchmarck,我保持恒定/. 重复我的清单和造成
.save

对于每个元素,它需要 40 秒。 称呼
.saveAll

在它落后的同一个列表中 2 秒。 称呼
.saveAll

偶数 30K 元素占用 4 秒。 在执行每个测试之前,我肯定踢了我的表。 甚至包装
.saveAll

拨打驴子 50 占据 10 秒S. 30 千

清楚的
.saveAll

与整个列表一起,它似乎是最快的。

我试图查看源代码 Spring Data, 但
https://github.com/spring-proj ... .java
我唯一找到有价值的东西。 在这里看来
.saveAll

只是重复一切
Iterable

和原因
.save

正如我所做的那样,在每个人。 那么这么快地发生这种情况吗? 它是否在自己内部进行了一些交易包?
已邀请:

詹大官人

赞同来自:

没有您的代码,我必须猜测它是由于为存储时为每个对象创建新事务的开销
save

, 与一个交易的开放相比
saveAll

.

注意定义
save


saveAll

, 它们都是注释
@Transactional

. 如果您的项目配置正确,显然发生,因为实体存储在数据库中,这意味着只要调用这些方法中的一个,就会创建该事务。 如果你打电话
save

在循环中,它意味着 , 新交易是每次打电话时创建的
save

, 但在这种情况下
saveAll

无论持久实体数量如何,都会为其创建一个挑战,并且为此创建了一个事务。

我假设测试本身不是在交易中执行的 , 如果它必须在事务中运行,则将在此事务中执行保存的所有呼叫,因为默认事务分发等于
Propagation.REQUIRED

, 这意味着如果交易已经打开,则将在其中执行呼叫。 如果您打算使用 spring data, 我强烈推荐你读过的
https://docs.spring.io/spring/ ... .html
.

要回复问题请先登录注册