Hibernate的延遲載入和抓取策略

2021-09-22 08:32:29 字數 4004 閱讀 3136

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.多對一關聯的查詢策略 如果程式載入乙個物件的目的是為了訪問它的屬性,可採取立即檢索,如果程式載入乙個持久...