Ehcache二级缓存,查询缓存,分布式缓存总结
程序员文章站
2022-05-21 13:48:29
...
二级缓存和查询缓存都相当于一个map。
二级缓存缓存的key为id,value为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。iterate()和list()区别如下:
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和二级缓存和查询缓存都有关。
查询缓存的key是一个QueryKey(其属性如下),value为id集合。
如果以上属性中有一个不同,查询缓存就不会命中。使用list()时,如果是第一次,查询缓存取出实体列表,然后从实体列表中提取出id列表作为value。如果是查询缓存命中,就会根据QueryKey取出id列表,然后根据id列表去二级缓存中load()对象,如果二级缓存中没有哪个对象,就会根据id去数据库查询,二级缓存中没有n个对象就会去数据库查询n次:select p from pojo p where id=?,因此就会有机会出现传说中n+1问题。
在查询缓存中,查询缓存缓存普通属性,即对于属性的查询,value值为要查询的属性列表,对于实体,value值为实体的id列表,而对于属性的查询由于从value中直接可以查出就不会用到二级缓存,但对于实体的查询,必须结合二级缓存使用。下面对此进行说明:
前提:执行同一hql语句,如:select s from Student s或select s.name from Student s
1.开启查询缓存,关闭二级缓存时:
第二次查询属性时不会发出sql,第一次查询实体时会发出sql。
2.开启查询缓存,开启二级缓存
第二次查询属性,实体时都不发sql
对于Ehcache分布式缓存,好像查询缓存不能更新:
在同一系统中,当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于两个以上系统部署在不同机子上,并在他们之间配置了ehcache的分布式缓存,当A系统修改表数据(save,update,delete)后,b系统会更新查询缓存吗?
答:好像是不能的,即ehcache的分布式缓存对查询缓存无效。(我在项目中配置了Ehcache的分布式缓存,二级缓存可以生效,但查询缓存不能更新。是不是一个系统中的Hibernate不能够识别其他系统中hibernate是否进行了save,update,delete操作?而Ehcache也没对此进行整合,望知道的大牛给说一下。)
二级缓存缓存的key为id,value为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。iterate()和list()区别如下:
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和二级缓存和查询缓存都有关。
查询缓存的key是一个QueryKey(其属性如下),value为id集合。
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; ...... }
如果以上属性中有一个不同,查询缓存就不会命中。使用list()时,如果是第一次,查询缓存取出实体列表,然后从实体列表中提取出id列表作为value。如果是查询缓存命中,就会根据QueryKey取出id列表,然后根据id列表去二级缓存中load()对象,如果二级缓存中没有哪个对象,就会根据id去数据库查询,二级缓存中没有n个对象就会去数据库查询n次:select p from pojo p where id=?,因此就会有机会出现传说中n+1问题。
在查询缓存中,查询缓存缓存普通属性,即对于属性的查询,value值为要查询的属性列表,对于实体,value值为实体的id列表,而对于属性的查询由于从value中直接可以查出就不会用到二级缓存,但对于实体的查询,必须结合二级缓存使用。下面对此进行说明:
前提:执行同一hql语句,如:select s from Student s或select s.name from Student s
1.开启查询缓存,关闭二级缓存时:
第二次查询属性时不会发出sql,第一次查询实体时会发出sql。
2.开启查询缓存,开启二级缓存
第二次查询属性,实体时都不发sql
对于Ehcache分布式缓存,好像查询缓存不能更新:
在同一系统中,当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于两个以上系统部署在不同机子上,并在他们之间配置了ehcache的分布式缓存,当A系统修改表数据(save,update,delete)后,b系统会更新查询缓存吗?
答:好像是不能的,即ehcache的分布式缓存对查询缓存无效。(我在项目中配置了Ehcache的分布式缓存,二级缓存可以生效,但查询缓存不能更新。是不是一个系统中的Hibernate不能够识别其他系统中hibernate是否进行了save,update,delete操作?而Ehcache也没对此进行整合,望知道的大牛给说一下。)
推荐阅读
-
mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存
-
Java面试题:Hibernate的二级缓存与Hibernate多表查询
-
memcached完全剖析ehcache memcached redis 缓存技术总结
-
MySQL查询缓存总结_MySQL
-
memcached完全剖析ehcache memcached redis 缓存技术总结
-
hibernate中使用分布式ehcache hibernateehcacheterracotta分布式缓存
-
sourceforge优秀项目介绍之三:Ehcache 分布式缓存
-
Ehcache二级缓存,查询缓存,分布式缓存总结
-
Ehcache二级缓存,查询缓存,分布式缓存总结
-
hibernate二级缓存之ehcache初探