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也没对此进行整合,望知道的大牛给说一下。)
|