代码之家  ›  专栏  ›  技术社区  ›  Yottabyte

Spring data save vs saveAll性能

  •  26
  • Yottabyte  · 技术社区  · 6 年前

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

    为了测试,我创建了10k实体,它只包含一个id和一个随机字符串(对于基准,我将字符串保持为常量),添加到一个列表中。迭代我的列表并调用 .save 在每个元素上,需要40秒。使命感 .saveAll 在同一个列表上,在2秒内完成。使命感 .全部保存 即使有30k个元素,也需要4秒钟。我确保在执行每个测试之前截断我的表。甚至配料 .全部保存 用30k调用50个子列表需要10秒。

    简单的 .全部保存 与整个名单似乎是最快的。

    我试图浏览Spring数据源代码,但 this 是我发现的唯一有价值的东西。这里似乎 .全部保存 简单地遍历整个 Iterable 和电话 拯救 就像我做的那样。那么它怎么会快那么多呢?它是否在内部执行事务批处理?

    1 回复  |  直到 6 年前
        1
  •  39
  •   Sofia Paixão davecar21    6 年前

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

    请注意的定义 拯救 全部保存 它们都带有注释 @Transactional 。如果您的项目配置正确(似乎是这样的,因为实体正在保存到数据库中),这意味着无论何时调用其中一个方法,都将创建一个事务。如果你打电话 拯救 在循环中,这意味着每次调用时都会创建一个新事务 拯救 ,但在 全部保存 有一个调用,因此创建了一个事务,无论保存的实体数量如何。

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