笔记: Hibernate缓存机制

一级缓存:事务级缓存 或 Session级缓存
    其实质是由Hibernate自动维护的一个map,根据id来缓存实体对象(不存放普通属性的查询)
    ***不能跨sesseion/transaction访问
    无论是list(), load()还是iterate,只要读出的是对象, 都会自动填充一级缓存
    但是list()本身不去使用缓存, iterate是先去DB中select id出来,在一个一个load(),如果缓存中有就直接返回,没有的话再去数据库中查询
   
二级缓存
    SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,可以跨session访问
    一般由EhCache, OSCache等实现
    也只是针对ID来缓存实体对象
    1) EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
    2) OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
    3) SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
    4) JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
   
    适合存放到第二级缓存中的数据
    1) 很少被修改的数据
    2) 不是很重要的数据,允许出现偶尔并发的数据
    3) 不会被并发访问的数据
    4) 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

    不适合存放到第二级缓存的数据?
    1) 经常被修改的数据
    2) 财务数据,绝对不允许出现并发
    3) 与其他应用共享的数据。
   
查询缓存
    默认是关闭的。查询缓存是针对普通属性结果集的缓存, 对实体对象的结果集只缓存id
    查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
   
    Hibernate的Query缓存策略的过程如下:
      1) Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等
      2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中
      3) Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空

一些注意事项:
    1) 针对普通属性结果集的缓存
    2) 对是实体对象的结果集,只缓存id
    3) 用查询缓存,需要打开查询缓存,并且在调用list方法之前需要显示的调用query.setCacheable(true);
    4) 查询缓存与session无关,即在一个session上做了查询缓存,那么在另一个session中可以取到查询缓存的内容,不再发出SQL
    5) 查询缓存只对query.list()操作有效,query.iterate()操作不会使用查询缓存
    6) 一级缓存与二级缓存是缓存实体,而查询缓存是缓存普通属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值