Hibernate的查詢優化策略

2021-10-01 13:43:25 字數 4047 閱讀 1681

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 查詢優化

1.延遲載入先獲取到 物件,當真正使用到該物件中的屬性的時候,才會傳送sql語句,是hibernate框架提公升效能的方式 2.類級別的延遲載入 session物件的load方法預設就是延遲載入 customer c session.load customer.class,1l 沒有傳送sql語句,...

Hibernate框架 查詢優化

一 類級別查詢 get方法 沒有任何策略,呼叫即立即查詢資料庫載入資料。load方法 應用類級別的載入策略 lazy 預設值 true,查詢類時,會返回 物件,會在使用屬性時,根據關聯的session查詢資料庫,載入資料 lazy false.load方法會與get方法沒有任何區別,呼叫時即載入資料...

十一 Hibernate查詢優化之策略設定

使用hibernate查詢乙個物件的時候,查詢其關聯物件.應該如何查詢,可以通過配置對映檔案的屬性來設定。lazy屬性 解決查詢的時機的問題,是否延遲載入關聯資料,例如下面2條語句 customer c1 customer session.get customer.class,1 system.ou...