hibernate查詢緩存
hibernate查詢緩存(hibernate默認(rèn)是關(guān)閉的)
查詢緩存是針對普通屬性結(jié)果集的緩存
對實(shí)體對象的結(jié)果集只緩存id
查詢緩存的生命周期,當(dāng)前關(guān)聯(lián)的表發(fā)生修改,那么查詢緩存生命周期結(jié)束
查詢緩存的配置和使用:
1. 啟用查詢緩存:在hibernate.cfg.xml中加入:
<property name=”hibernate.cache.use_query_cache”>true</property>
測試查詢緩存:
一.
Query query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
}
System.out.println(“------------------------------------------”);
query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
}
第二次沒有去查詢數(shù)據(jù)庫,因?yàn)閱⒂昧瞬樵兙彺?/p>
二.
Query query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
}
第二次沒有去查詢數(shù)據(jù)庫,因?yàn)椴樵兙彺嫔芷谂csession生命周期無關(guān)
三.
Query query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
for(Iterator iter =query.iterate();iter.hasNext();){
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“select s.name from Student s”);
//啟用查詢緩存
query.setCacheable(true);
for(Iterator iter = query.iterate();iter.hasNext();){
}
第二去查詢數(shù)據(jù)庫,因?yàn)椴樵兙彺嬷粚uery.list()起作用,對query.iterate()不起作用,也就是說query.iterate()不使用查詢緩存
四.
Query query = session.createQuery(“ from Student s”);
//query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
//query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
第二去查詢數(shù)據(jù)庫,因?yàn)閘ist默認(rèn)每次都會(huì)發(fā)出查詢sql
五.
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
第二去查詢數(shù)據(jù)庫時(shí),會(huì)發(fā)出N條sql語句,因?yàn)殚_啟了查詢緩存,關(guān)閉了二級緩存,那么查詢緩存會(huì)緩存實(shí)體對象的id,所以hibernate會(huì)根據(jù)實(shí)體對象的id去查詢相應(yīng)的實(shí)體,如果緩存中不存在相應(yīng)的實(shí)體,那么將發(fā)出根據(jù)實(shí)體id查詢的sql語句,否則不會(huì)發(fā)出sql,使用緩存中的數(shù)據(jù)
六.
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
}
第二不會(huì)發(fā)出sql,因?yàn)殚_啟了二級緩存和查詢緩存,查詢緩存緩存了實(shí)體對象的id列表,hibernate會(huì)根據(jù)實(shí)體對象的id列表到二級緩存中取得相應(yīng)的數(shù)據(jù)
posted on 2009-04-06 11:58 胡鵬 閱讀(4889) 評論(0) 編輯 收藏 所屬分類: hibernate