gpt4 book ai didi

java - Spring 数据保存与 saveAll 性能

转载 作者:行者123 更新时间:2023-12-01 22:57:37 29 4
gpt4 key购买 nike

我试图理解为什么 saveAll 比 Spring Data 存储库中的 save 具有更好的性能。我正在使用 CrudRepository ,可以看到 here .

为了测试,我创建了 10k 个实体并将其添加到列表中,这些实体只有一个 id 和一个随机字符串(为了进行基准测试,我将字符串保持为常量)。迭代我的列表并在每个元素上调用 .save,花了 40 秒。对同一整个列表调用 .saveAll 在 2 秒内完成。即使使用 30k 元素调用 .saveAll 也需要 4 秒。我确保在执行每个测试之前截断我的表。即使对 50 个子列表进行批处理 .saveAll 调用也需要 10 秒(30k)。

包含整个列表的简单 .saveAll 似乎是最快的。

我尝试浏览 Spring Data 源代码,但是 this这是我发现的唯一有值(value)的东西。在这里, .saveAll 似乎只是迭代整个 Iterable 并像我一样对每个迭代调用 .save 。那么它是如何更快的呢?它在内部进行一些事务批处理吗?

最佳答案

如果没有您的代码,我必须猜测,我相信这与为 save 情况下保存的每个对象创建新事务的开销有关。与在 saveAll 的情况下打开一笔交易相比.

注意 save 的定义和saveAll它们都注释有 @Transactional 。如果您的项目配置正确(由于实体被保存到数据库中,这似乎是这种情况),这意味着每当调用这些方法之一时都会创建一个事务。如果您调用save在一个循环中,这意味着每次调用 save 时都会创建一个新事务,但在 saveAll 的情况下无论保存的实体数量有多少,都会有一次调用,因此会创建一笔交易。

我假设测试本身不是在事务中运行,如果要在事务中运行,则所有对 save 的调用都将在该事务中运行,因为默认事务传播是 Propagation.REQUIRED ,这意味着如果已经有一个事务打开,则调用将在其中运行。如果您计划使用 Spring Data,我强烈建议您阅读 transaction management in Spring .

关于java - Spring 数据保存与 saveAll 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58433152/

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