【发布时间】:2018-09-26 21:35:21
【问题描述】:
我试图理解为什么 saveAll 比保存在 Spring Data 存储库中的性能更好。我正在使用CrudRepository,可以看到here。
为了测试,我创建了 10k 个实体并将它们添加到一个列表中,这些实体只有一个 id 和一个随机字符串(对于基准测试,我将字符串保持为常数)。遍历我的列表并在每个元素上调用.save,花了 40 秒。在同一整个列表上调用 .saveAll 在 2 秒内完成。使用 30k 个元素调用 .saveAll 需要 4 秒。在执行每个测试之前,我确保截断我的表。即使将 .saveAll 调用批处理到 50 个子列表也需要 10 秒和 30k。
带有整个列表的简单.saveAll似乎是最快的。
我尝试浏览 Spring Data 源代码,但 this 是我发现的唯一有价值的东西。在这里,.saveAll 似乎只是迭代整个Iterable 并像我一样在每个.save 上调用。那么它是如何快得多的呢?它是否在内部进行一些事务批处理?
【问题讨论】:
-
Spring是开源的,你看代码了吗?
-
你的交易边界在哪里?显示您的测试代码会有所帮助。
标签: java spring hibernate spring-data spring-data-jpa