iterate()不須要開啓查詢緩存,它首先發出一個sql如」select s.id from Student s」去數據庫把id屬性列表取出來,而後再根據id列表一個一個load(),若是緩存有從緩存取,若是緩存沒有就從數據庫取:select s.id,s.name,s.classid from Student s where s.id=?,取出後再存入二級緩存。Iterate總會發出取id列表的語句。
List()須要開啓查詢緩存,它首先發出一個sql如」select s.id,s.name,s.classid from Student s…」去數據庫取出全部相關實體,並將這些實體存入二級緩存,將此sql語句及一些相關信息做爲key,id列表做爲值,第二次查詢這條語句時就會去根據sql語句及相關信息去key裏找,若是有就會把id列表取出一個一個load(),接下來就和iterate同樣了。List通常只有第一次發發出取實體列表的語句,之後的id列表就會去查詢緩存取id列表,不會再發出sql語句。
前提:執行同一hql語句,如:select s from Student s
1. 關閉查詢緩存,開啓二級緩存時:
第二次查詢屬性時iterate只會發出獲取id列表的sql,list會發出和第一次同樣的請求實體的sql。
2. 開啓查詢緩存,開啓二級緩存
第二次查詢屬性時iterate只會發出獲取id列表的sql,list不發sql。
以上說明iterate只和二級緩存有關,list和二級緩存和查詢緩存都有關。
|
- public class QueryKey implements Serializable {
- private final String sqlQueryString;//sql語句
- private final Type[] types;
- private final Object[] values;
- private final Integer firstRow;//要查詢的起始數
- private final Integer maxRows;//要查詢的個數
- private final Map namedParameters;
- private final EntityMode entityMode;
- private final Set filters;
- private final int hashCode;
- ......
- }
前提:執行同一hql語句,如:select s from Student s或select s.name from Student s
1. 開啓查詢緩存,關閉二級緩存時:
第二次查詢屬性時不會發出sql,第一次查詢實體時會發出sql。
2. 開啓查詢緩存,開啓二級緩存
第二次查詢屬性,實體時都不發sql
|
在同一系統中,當用Hibernate的方式修改表數據(save,update,delete等等),這時EhCache會自動把緩存中關於此表的全部緩存所有刪除掉(這樣能達到同步)。但對於兩個以上系統部署在不一樣機子上,並在他們之間配置了ehcache的分佈式緩存,當A系統修改表數據(save,update,delete)後,b系統會更新查詢緩存嗎?
答:好像是不能的,即ehcache的分佈式緩存對查詢緩存無效。(我在項目中配置了Ehcache的分佈式緩存,二級緩存能夠生效,但查詢緩存不能更新。是否是一個系統中的Hibernate不可以識別其餘系統中hibernate是否進行了save,update,delete操做?而Ehcache也沒對此進行整合,望知道的大牛給說一下。)
|