簡體   English   中英

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

[英]How does Hibernate's batch-fetching algorithm work?

我在“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代理?

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

這有助於避免創建大量不同的預准備語句。

需要解析每個查詢(預准備語句),並且需要由數據庫計算和緩存其執行計划。 此過程可能比已經緩存語句的查詢的實際執行要昂貴得多。

大量不同的語句可能會導致從緩存中清除其他緩存的語句,從而降低整體應用程序性能。

此外,由於硬分析通常非常昂貴,因此執行多個緩存的預准備語句(包括多個數據庫往返)通常比解析和執行新語句更快。 因此,除了減少不同語句數量的明顯好處之外,通過執行11個緩存語句檢索所有119個實體實際上比創建和執行包含所有119個ID的單個新實體更快。

正如評論中已經提到的,Hibernate調用ArrayHelper.getBatchSizes方法來確定給定最大批量大小的批量大小。

我在網上找不到有關hibernate如何處理批量加載的任何信息,但從您的信息判斷,可以猜到以下內容:

為什么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
  3. ...

為什么批量加載器可以初始化:20,10,9,8,7,6,5,4,3,2,1代理? 我認為hibernate團隊選擇這個作為加載未初始化代理的“常見”數N和內存消耗所需的加載器數量之間的平衡。 本可以為0和batch_size之間的每個N創建一個加載器,但我懷疑加載器有相當大的內存占用, 所以這是一個權衡 算法可以是這樣的(有根據的猜測):

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

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

  2. for n = 0..10 create loader(n)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM