hibernate查詢快取

2021-08-31 14:28:52 字數 4353 閱讀 7759

自:

查詢快取的生命週期,當查詢關聯的表發生改變,那麼查詢快取的生命週期結束(delete、update、modify)

啟用查詢快取:

1.hibernate.cfg.xml中配置:true

2.**中用setcacheable(true)手動啟用

只對list()方法起作用

預設情況下list()每次都會發sql語句,只有配置了查詢快取它才會利用快取。

例項一、查詢普通屬性

1.查詢普通屬性,開啟二級快取和查詢快取,在同乙個session中和不同session中

**:session session = this.sf.opensession();

list list = session.createquery("select id from order")

.setcacheable(true)

.list();

system.out.println("數量:"+list.size());

//session = this.sf.opensession();

list l = session.createquery("select id from order")

.setcacheable(true)

.list();

system.out.println("數量:"+l.size());

session.close();

執行結果都一樣,所以查詢快取的生命週期與session無關:

hibernate:

select

order0_.id as col_0_0_

from

t_order order0_

數量:3

數量:3

2.查詢普通屬性,關閉二級快取,開啟查詢快取,在同乙個session中

**同1

執行結果:

hibernate:

select

order0_.id as col_0_0_

from

t_order order0_

數量:3

數量:3

3.查詢普通屬性,開啟二級快取,關閉查詢快取,在同乙個session中

**:session session = this.sf.opensession();

list list = session.createquery("select id from order")

.setcacheable(false)

.list();

system.out.println("數量:"+list.size());

list l = session.createquery("select id from order")

.setcacheable(false)

.list();

system.out.println("數量:"+l.size());

session.close();

執行結果:

hibernate:

select

order0_.id as col_0_0_

from

t_order order0_

數量:3

hibernate:

select

order0_.id as col_0_0_

from

t_order order0_

數量:3

二、查詢實體物件

1.關閉二級快取和查詢快取,在同乙個session中

**:public void test1()

執行結果:

hibernate:

select

order0_.id as id1_,

order0_.ordernum as ordernum1_,

order0_.fk_user_id as fk3_1_

from

t_order order0_

數量:3

hibernate:

select

order0_.id as id1_,

order0_.ordernum as ordernum1_,

order0_.fk_user_id as fk3_1_

from

t_order order0_

數量:3

2.關閉二級快取,開啟查詢快取,在同乙個session中

**:session session = this.sf.opensession();

list list = session.createquery("from order")

.setcacheable(true)

.list();

system.out.println("數量:"+list.size());

list l = session.createquery("from order")

.setcacheable(true)

.list();

system.out.println("數量:"+l.size());

session.close();

執行結果:

hibernate:

select

order0_.id as id1_,

order0_.ordernum as ordernum1_,

order0_.fk_user_id as fk3_1_

from

t_order order0_

數量:3

數量:3

之所以第二次不發出sql語句,是因為在同乙個session中,實體物件儲存到了一級快取中;而查詢快取中儲存了實體物件的id列表,第二次查詢就根據id從一級快取中取得資料。開啟二級快取,開啟查詢快取,在不同session中也是這樣的結果,只是實體物件儲存到了二級快取中,第二次查詢從二級快取中去找。

3.關閉二級快取,開啟查詢快取,在兩個session中

**:session session = this.sf.opensession();

list list = session.createquery("from order")

.setcacheable(true)

.list();

system.out.println("數量:"+list.size());

session.close();

//第二個session

session = this.sf.opensession();

list l = session.createquery("from order")

.setcacheable(true)

.list();

system.out.println("數量:"+l.size());

session.close();

執行結果:

hibernate:

select

order0_.id as id1_,

order0_.ordernum as ordernum1_,

order0_.fk_user_id as fk3_1_

from

t_order order0_

數量:3

hibernate:

select

order0_.id as id1_0_,

order0_.ordernum as ordernum1_0_,

order0_.fk_user_id as fk3_1_0_

from

t_order order0_

where

order0_.id=?

hibernate:

select

order0_.id as id1_0_,

order0_.ordernum as ordernum1_0_,

order0_.fk_user_id as fk3_1_0_

from

t_order order0_

where

order0_.id=?

hibernate:

select

order0_.id as id1_0_,

order0_.ordernum as ordernum1_0_,

order0_.fk_user_id as fk3_1_0_

from

t_order order0_

where

order0_.id=?

數量:3

這種情況下,當第二次查詢執行的時候,在二級快取和一級緩衝中都找不到實體物件,所以list()只有拿著id到資料庫中乙個乙個找,於是產生了n+1問題。

結論:1.查詢快取是對普通屬性結果集的快取

2.對實體物件的快取集只快取id

Hibernate的查詢快取

在hibernate的使用中,大家都很熟悉一級快取和二級快取的使用,在hibernate中還有另一種快取,查詢快取。查詢快取是依賴於二級快取的。一.查詢快取的執行方式 hibernate的查詢快取是主要是針對普通屬性結果集的快取,而對於實體物件的結果集只快取id。在一級快取,二級快取和查詢快取都開啟...

hibernate的查詢快取

在hibernate的使用中,大家多數時間都在討論一級快取和二級快取,而往往忽略了查詢快取。其實hibernate的查詢快取在使用過程中也起著同樣重要的作用。hibernate的查詢快取是主要是針對普通屬性結果集的快取,而對於實體物件的結果集只快取id。在一級快取,二級快取和查詢快取都開啟的情況下作...

hibernate的查詢快取

在hibernate的使用中,大家多數時間都在討論一級快取和二級快取,而往往忽略了查詢快取。其實hibernate的查詢快取在使用過程中也起著同樣重要的作用。hibernate的查詢快取是主要是針對普通屬性結果集的快取,而對於實體物件的結果集只快取id。在一級快取,二級快取和查詢快取都開啟的情況下作...