ehcache使用详解


Java缓存框架 EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,缓存数据有两级:内存和磁盘,因此无需担心容量问题,是Hibernate中默认的CacheProvider。

一、独立使用,结合spring
 可以对变化不大,不要求实时数据的方法结果缓存起来。(缓存方法结果)
参考:http://blog.sina.com.cn/s/blog_46d5caa40100ka9z.html

二、配合hibernate使用
缓存范围:

1、事务范围高速缓存,对应于一级缓存(单Session)

       2、过程(JVM)范围高速缓存,对应于二级缓存(单SessionFactory)

              3、集群范围高速缓存,对应于二级缓存(多SessionFactory)
缓存数据要求:
              1、很少改变的数据;
               2 、不重要的数据,如论坛帖子,无需实时的数据
              3、读大于写有用;
              4、应用程序固有的而非共享的;

 

§ Hibernate中的二级缓存是可插拔的。

§ Hibernate二级缓存支持对象缓存、集合缓存、查询结果集缓存,对于查询结果集缓存可选。

§  查询缓存:需要两个额外的物理高速缓存区域:一个用于存放查询的结果集;另一个用于存储表上次更新的时间戳



二级缓存和查询缓存都相当于一个map,二级缓存中的key为id,value为实体对象。
二级缓存缓存的key为id,value为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。

List需要开启查询缓存,查询缓存中存放的为
此sql语句及一些相关信息作为key,id列表作为值
,之后和load查询一一致,根据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

需要设置 
query.setCacheable(true);//激活查询缓存
query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可选
(参考:http://www.iteye.com/topic/18904
            http://jinnianshilongnian.iteye.com/blog/1525884 
)

 
三、分布式缓存
对于Ehcache分布式缓存,好像查询缓存不能更新:
在同一系统中,当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于两个以上系统部署在不同机子上,并在他们之间配置了ehcache的分布式缓存,当A系统修改表数据(save,update,delete)后,b系统会更新查询缓存吗?
答:好像是不能的,即ehcache的分布式缓存对查询缓存无效。(我在项目中配置了Ehcache的分布式缓存,二级缓存可以生效,但查询缓存不能更新。是不是一个系统中的Hibernate不能够识别其他系统中hibernate是否进行了save,update,delete操作?而Ehcache也没对此进行整合,望知道的大牛给说一下。) ---------有待验证






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值