gpt4 book ai didi

java - Hibernate 的批量抓取算法是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:02 25 4
gpt4 key购买 nike

我在“Manning - Java Persistence with Hibernate”中找到了关于批量获取算法的描述:

What is the real batch-fetching algorithm? (...) Imagine a batch size of 20 and a total number of 119 uninitialized proxies that have to be loaded in batches. At startup time, Hibernate reads the mapping metadata and creates 11 batch loaders internally. Each loader knows how many proxies it can initialize: 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1. The goal is to minimize the memory consumption for loader creation and to create enough loaders that every possible batch fetch can be produced. Another goal is to minimize the number of SQL SELECTs, obviously. To initialize 119 proxies Hibernate executes seven batches (you probably expected six, because 6 x 20 > 119). The batch loaders that are applied are five times 20, one time 10, and one time 9, automatically selected by Hibernate.

但我仍然不明白它是如何工作的。

  1. 为什么有 11 个批量装载机?
  2. 为什么批量加载器可以初始化:20、10、9、8、7、6、5、4、3、2、1 个代理?

如果有人可以提出一步一步的算法......:)

最佳答案

这有助于避免创建大量不同的准备好的语句。

每一个query(prepared statement)都需要解析,其执行计划需要为calculated and cached由数据库。此过程可能比实际执行已缓存语句的查询要昂贵得多。

大量不同的语句可能会导致从缓存中清除其他缓存的语句,从而降低整体应用程序性能。

此外,由于硬解析通常非常昂贵,因此执行多个缓存的准备好的语句(包括多个数据库往返)通常比解析和执行一个新语句更快。因此,除了减少不同语句数量的明显好处外,通过执行 11 个缓存语句来检索所有 119 个实体实际上可能比创建和执行一个包含所有 119 个 id 的新实体更快。

正如评论中已经提到的,Hibernate 调用ArrayHelper.getBatchSizes 方法来确定给定最大批大小的批大小。

关于java - Hibernate 的批量抓取算法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469147/

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