hibernate查詢緩存
hibernate查詢緩存(hibernate默認是關閉的)
查詢緩存是針對普通屬性結果集的緩存
對實體對象的結果集只緩存id
查詢緩存的生命周期,當前關聯的表發生修改,那么查詢緩存生命周期結束
查詢緩存的配置和使用:
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();){
}
第二次沒有去查詢數據庫,因為啟用了查詢緩存
二.
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();){
}
第二次沒有去查詢數據庫,因為查詢緩存生命周期與session生命周期無關
三.
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();){
}
第二去查詢數據庫,因為查詢緩存只對query.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();){
}
第二去查詢數據庫,因為list默認每次都會發出查詢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();){
}
第二去查詢數據庫時,會發出N條sql語句,因為開啟了查詢緩存,關閉了二級緩存,那么查詢緩存會緩存實體對象的id,所以hibernate會根據實體對象的id去查詢相應的實體,如果緩存中不存在相應的實體,那么將發出根據實體id查詢的sql語句,否則不會發出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();){
}
第二不會發出sql,因為開啟了二級緩存和查詢緩存,查詢緩存緩存了實體對象的id列表,hibernate會根據實體對象的id列表到二級緩存中取得相應的數據
posted on 2009-04-06 11:58 胡鵬 閱讀(4885) 評論(0) 編輯 收藏 所屬分類: hibernate