小编典典

Hibernate的批量获取算法如何工作?

algorithm

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

真正的批量提取算法是什么?(…)想象一个批量大小为20且必须分批加载的总数为119的未初始化代理。在启动时,Hibernate读取映射元数据并在内部创建11个批处理加载器。每个加载程序都知道可以初始化多少个代理:20、10、9、8、7、6、5、4、3、2、1。目标是最大程度地减少创建加载程序的内存消耗,并创建足够的加载程序以使每个加载程序可能会批量提取。显然,另一个目标是最大程度地减少SQL
SELECT的数量。要初始化119个代理,Hibernate将执行7个批处理(您可能期望6个批处理,因为6 x 20>
119)。所应用的批处理加载器是Hibernate自动选择的五次20,一次10和一次9。

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

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

如果有人可以提出逐步算法… :)


阅读 243

收藏
2020-07-28

共1个答案

小编典典

我在网上找不到有关休眠如何处理批量加载的任何信息,但是从您的信息来看,人们可能会 猜测 以下内容:

为什么要使用11个批处理装载机?

批量大小为20时,如果要最大程度减少代理的 任意 组合所需的装载程序的数量,则基本上有两种选择:

  • 为1,2,3,4,5,6,7,… 20,21,22,23,…创建一个加载器N个未初始化的代理(愚蠢!)或
  • 为1..9之间的任何N创建一个加载器,然后batch_size/2(递归)创建更多的加载器

示例:对于批量大小为40的装载机,最终将装载40、20、10、9、8、7、6、5、4、3、2、1个装载机。

  1. 如果您有33个未初始化的代理,则可以使用以下装载程序:20、10、3
  2. 如果您有119个未初始化的代理,则可以使用以下装载程序40(x2),20、10、9

为什么批量加载程序可以初始化:20、10、9、8、7、6、5、4、3、2、1个代理?
我认为休眠团队选择此作为平衡,以加载未初始化代理的“公共”数量N和内存消耗之间的平衡。可以为0和之间的每个N创建一个加载器batch_size,但是我怀疑加载器具有相当大的内存占用,
因此这是一个折衷方案 。该算法 可以 是这样的(有根据的猜测):

  1. n = batch_size; while (n > 10)

1.1。 loader(n); n = n / 2

  1. for n = 0..10 create loader(n)
2020-07-28