2. 抓取策略
3. 批量抓取
延遲載入(也稱為懶載入)是hibernate關聯關係物件預設的載入方式,延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。
通常將延遲載入分為兩類:一類叫做類級別延遲,另一類叫做關聯級別的延遲。類級別的延遲指的是查詢某個物件的時候,是否採用有延遲,這個通常在標籤上配置lazy屬性。關聯級別的延遲指的是,查詢乙個物件的關聯物件的時候是否採用延遲載入,這個通常在或上配置lazy屬性。
使用load方法檢索某個物件的時候,這個類是否採用延遲載入的策略,就是類級別的延遲。類級別的延遲一般在上配置lazy屬性,lazy的預設值是true,預設是延遲載入的,所以使用load方法去查詢的時候,不會馬上傳送sql語句,當真正使用該物件的時候,才會傳送sql語句。
customer customer = session.
load
(customer.
class
,1l)
;
其實如果不想使用延遲載入也有很多種方法,當然最簡單的就是將這個類的對映檔案上的lazy設定為false,當然也可以將這個持久化類改為final修飾,如果改為final修飾的話,就無法生成**類,就會使延遲載入失效。這是類級別的延遲載入,類級別的延遲載入一般我們不進行修改, 採用預設值lazy="true"就可以了。
其實主要的是關聯級別的延遲載入,關聯級別的延遲載入指的是查詢到某個物件以後,檢索它的關聯物件的時候是否採用延遲載入。
customer customer = session.
get(customer.
class
,1l)
;set
linkmans = customer.
getlinkmans()
;
通過客戶查詢其關聯的聯絡人物件,在查詢聯絡人的時候是否採用延遲載入稱為是關聯級別的延遲。關聯級別的延遲通常是在或上來進行配置。
延遲載入介紹過了,延遲載入也是往往和抓取策略一起使用提公升開發的程式的效能的,那麼接下來我們要來研究抓取策略了。
抓取策略指的是查詢到某個物件的時候,如何抓取其關聯物件。這個也可以通過配置完成,在關聯物件的標籤上配置fetch屬性,關聯上就分為是在或上,也都有不同的取值。
接下來我們通過**測試的方式來檢視每種取值的效果。
//預設情況
//fetch:select 單錶查詢
//lazy:true 使用時才載入集合資料
public
void
test1()
//fetch:select 單錶查詢
//lazy:false 立即載入集合資料
public
void
test2()
//fetch:select 單錶查詢
//lazy:extra 極其懶惰,與懶載入效果基本一致. 如果只獲得集合的size.只查詢集合的size(count語句)
public
void
test3()
//fetch:join 多表查詢
//lazy:true|false|extra 失效,立即載入
public
void
test4()
//fetch: subselect 子查詢
//lazy: true 使用時才載入集合資料
public
void
test5()
transaction.
commit()
; session.
close()
; sessionfactory.
close()
;}//fetch: subselect 子查詢
//lazy: false 立即載入集合資料
public
void
test6()
transaction.
commit()
; session.
close()
; sessionfactory.
close()
;}//fetch: subselect 子查詢
//lazy: extra 極其懶惰
public
void
test7()
transaction.
commit()
; session.
close()
; sessionfactory.
close()
;}
//預設情況
//fetch:select 單錶查詢
//lazy:proxy (此時一對多中一方類上的lazy屬性值為預設值true)
public
void
test1()
//fetch:select 單錶查詢
//lazy:false或者proxy (此時一對多中一方類上的lazy屬性的值為false)
public
void
test2()
//fetch:join 多表查詢
//lazy:proxy|false 失效,立即載入
public
void
test3()
我們可以簡單的總結一下fetch和lazy的作用,其實fetch主要控制抓取關聯物件的時候的傳送sql語句的格式的。lazy主要控制查詢其關聯物件的時候是否採用延遲載入。
在抓取的策略中有一種叫做批量抓取,就是同時查詢多個物件的關聯物件的時候,可以採用批量抓取進行優化。如果要實現批量的抓取效果,可以通過配置batch-size來完成。來看下下面的效果。
public
void
test1()
} transaction.
commit()
; session.
close()
; sessionfactory.
close()
;}
在沒有設定batch-size之前執行以上**,會出現如下的效果:
目前資料庫中有兩個客戶,那麼會發現執行**會發生三條sql語句。那麼我們能不能發生一條sql直接將兩個客戶的關聯的聯絡人一起查詢出來呢,我們可以在上配置batch-size="2"實現優化效果。
這時會發現sql語句發生了變化,當然資料量越大,效果越明顯。這是在查詢所有客戶的時候,批量抓取聯絡人,那麼如果我們要實現查詢多個聯絡人的時候,批量抓取聯絡人所對應的客戶物件呢?這時同樣需要配置batch-size。但是不是在上配置,而是在客戶一端的上配置batch-size即可。
public
void
test2()
transaction.
commit()
; session.
close()
; sessionfactory.
close()
;}
如果沒有配置batch-size執行上述**會得到如下效果:
如果配置了batch-size以後,再次執行上述**得到效果如下,注意:這時候要在客戶一端的對映檔案中的標籤上配置batch-size=「2」。
這時候可以看到,語句和之前就已經傳送了變化了。這些優化都是hibernate提公升自身效能的手段。
Hibernate 延遲載入和立即載入
概念 什麼是延遲載入 所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。一 延遲載入 nhibernate延遲載入須有session存在,且配置為lazy true 預設 dal中編寫方法如下 延遲載入 p...
Hibernate 延遲載入和立即載入
概念 什麼是延遲載入 所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。一 延遲載入 nhibernate延遲載入須有session存在,且配置為lazy true 預設 dal中編寫方法如下 延遲載入 p...
Hibernate 延遲載入和立即載入
延遲載入 延遲載入 lazy load懶載入 是當在真正需要資料時,才執行sql語句進行查詢,避免了無謂的效能開銷。延遲載入分類 01.類級別的查詢策略 02.一對多和多對多關聯的查詢策略 03.多對一關聯的查詢策略 如果程式載入乙個物件的目的是為了訪問它的屬性,可採取立即檢索,如果程式載入乙個持久...