今天在做hibernate的效能優化的時候,hibernate的抓取策略又派上用場了,於是順便總結了一下並作了如下記錄。
hibernate的抓取策略通常有下面四種:
1.連線抓取(join fetching) ,即hibernate通過 在select語句使用outer join(外連線)來 獲得物件的關聯例項或 者關聯集合.
2.查詢抓取(select fetching) ,即另外傳送一條 select 語句抓取當前物件的關聯實體或集合。除非你顯式的指定lazy="false"禁止 延遲抓取(lazy fetching),否則只有當你真正訪問關聯關係的時候,才會執行第二條select語句.
3.子查詢抓取(subselect fetching) ,即 另外傳送一條select 語句抓取在前面查詢到 的所有實體物件的關聯集合。除非你顯式的指定lazy="false" 禁止延遲抓取(lazy fetching),否則只有當你真正訪問關聯關係的時候,才會執行第二條
select語句 .
4.批量抓取(batch fetching) ,這種策略跟查詢抓取本質上是一樣的,只不過是 對查詢抓取的優化而已, 通過指定乙個主鍵或外來鍵 列表,hibernate使用單條select語句獲取一批物件例項或集合.
join fetching , select fetching 與 batch-size 可以為單個實體的抓取進 行效能優化;
join fetching , select fetching ,subselect fetching , batch fetching 都可以為集合的抓取進行效能優化;
下面將以乙個多對一雙向關聯對映(多個員工屬於同一部門)進行說明:
1.連線抓取(join fetching)
連線抓取, 使用連線抓取可以將本來需要查詢兩次(或多次)表的多次查詢 ,現在只需要一次查詢即可完成,以上面的關係模型為例,在初始化乙個含有一對多關係的 department 與employee 的時候, 會先載入department , 然後再根據department.id 將對應的employee 集合初始化, 一般完成初始化需要傳送至少兩條 sql 語句, 但如果用 連線抓取, 則會根據需要查詢的department.id, 將 department 表與 employee 表連線起來進行查詢,僅僅一條 sql 語句就可以將需要的資料全部載入出來;
使用連線抓取的com.lrh.hibernate/department.hbm.xml配置檔案修改節點如下:
測試核心**:
department d = (department)session.get(department.class,1);
system.out.println(d.getemployees.size());
2.查詢抓取(select fetching)
查詢抓取是在集合抓取的時候使用的預設策略, 即如果集合需要初始化, 那麼會重新發出一條 sql 語句初始化employee 集合;也就是常說的n+1次查詢的查詢策略;
使用連線抓取的com.lrh.hibernate/department.hbm.xml配置檔案修改節點如下:
測試核心**:
department d = (department)session.get(department.class,1);
system.out.println(d.getemployees.size());
3.子查詢抓取(subselect fetching)
子查詢抓取, 另外傳送一條select 語句抓取在前面查詢到(或者抓取到)的所有實體物件的關聯集合. 還是以上面的關係模型例子 : 如果查詢出了3 個 department 實體,由於開啟了懶載入,那麼他們的 employee 都沒有被初始化, 那麼我現在手動初始化乙個department 的 employee ,此時由於我選的是 subselect fetching策略,所以 hibernate 會將前面查詢到的實體物件(3 個 department)的關聯集合(在 )使用一條 select 語句一次性抓取出來, 這樣減少了與資料庫的互動次數, 一次將每個物件的集合都給初始化了;subselect 只在 集合中出現 。
使用連線抓取的com.lrh.hibernate/department.hbm.xml配置檔案修改節點如下:
測試核心**:
list results = session.createquery("from department d where d.id in (1,2,3)").list();
department d = (department)results.get(0);
system.out.println(d.getemployees.size());
4.批量抓取(batch fetching)
批量抓取跟查詢抓取本質上是一樣的,只不過將一次一條的 查詢策略改為一次 n 條的批量 查詢; 同樣以上面的關係模型為例,我查詢出了 3個 department 實體,employee 預設開啟了懶載入,我們可以如此設定 :
當初始化乙個 department 的 employee 集合的時候, hibernate 還是發出了一條sql 語句,跟查詢抓取不同的是:這條 sql 與是通過指定了 employee 表中的 departmentid 外來鍵列表(2個),hibernate 會以一條 sql 語句初始化 batch-size 指定的數量的 employee 集合;即根據batch-size 分成了兩組(一組有2個 department id 值的列表,第二組只有1個)來初始化 employee 集合。
使用連線抓取的com.lrh.hibernate/department.hbm.xml配置檔案修改節點如下:
測試核心**:
list results = session.createquery("from department d where d.id in (1,2,3)").list();
department d = (department)results.get(0);
system.out.println(d.getemployees.size());
hibernate 抓取策略
1.單端 對端是one,即many2one 1.1 在用many2one時,fetch可以採取select或者join.用select時,會另發一條語句載入關聯物件。用join時,用一條語句就查上來,相當於資料庫裡面的連線,內連線外連線取決於外來鍵是否允許為空。注意 這個規則僅適用於get或者loa...
Hibernate抓取策略
抓取策略指的是我們在獲取資料時,告訴hibernate以何種sql的方式去獲取,hibernate有三種抓取方式可供選擇,分別是select join subselect 該屬性只能在集合標籤和關聯關係標籤上使用。xml version 1.0 encoding utf 8 cn.hibernate...
hibernate 抓取策略
抓取策略 fetching strategy 抓取策略 fetching strategy 是指 當應用程式需要在 hibernate實體物件圖的 關聯關係間進行導航的時候,hibernate如何獲取關聯物件的策略。抓取策略可以在o r對映的元資料中宣告,也可以在特定的hql 或條件查詢 crite...