我在“ 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。
但是我还是不明白它是如何工作的。
如果有人可以提出逐步算法… :)
我在网上找不到有关休眠如何处理批量加载的任何信息,但是从您的信息来看,人们可能会 猜测 以下内容:
为什么要使用11个批处理装载机?
批量大小为20时,如果要最大程度减少代理的 任意 组合所需的装载程序的数量,则基本上有两种选择:
batch_size/2
示例:对于批量大小为40的装载机,最终将装载40、20、10、9、8、7、6、5、4、3、2、1个装载机。
为什么批量加载程序可以初始化:20、10、9、8、7、6、5、4、3、2、1个代理? 我认为休眠团队选择此作为平衡,以加载未初始化代理的“公共”数量N和内存消耗之间的平衡。可以为0和之间的每个N创建一个加载器batch_size,但是我怀疑加载器具有相当大的内存占用, 因此这是一个折衷方案 。该算法 可以 是这样的(有根据的猜测):
batch_size
n = batch_size; while (n > 10)
1.1。 loader(n); n = n / 2
loader(n); n = n / 2
for n = 0..10 create loader(n)