自:
查詢快取的生命週期,當查詢關聯的表發生改變,那麼查詢快取的生命週期結束(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。在一級快取,二級快取和查詢快取都開啟的情況下作...