Hibernate一级缓存和二级缓存的区别

一级缓存
  session级别的缓存,当我们使用了get load find Query等查询出来的数据,默认在session中就会有一份缓存数据,缓存数据就是从数据库将一些数据拷贝一份放到对应的地方.

  一级缓存不可卸载: (只要使用了session,肯定用到了session的缓存机制,是hibernate控制的,我们不能手动配置)

一级缓存的清理:
   close clear这两种方式会全部清理; evict方法是将指定的缓存清理掉

二级缓存
  sessionFactory级别的缓存,可以做到多个session共享此信息
sessionFactory缓存分类:
1. 内缓存: 预制的sql语句,对象和数据库的映射信息
2. 外缓存:存储的是我们允许使用二级缓存的对象

适合放在二级缓存中的数据:
1. 经常被修改的数据
2. 不是很想重要的数据,允许出现偶尔并发的数据
3. 不会被并发访问的数据
4. 参考数据

适合放到一级缓存中的数据:
1. 经常被修改的数据
2. 财务数据,绝对不允许出现并发
3. 与其它应用共享的数据

Hibernate的二级缓存策略的一般过程:
1. 条件查询的时候,
    String hql = “from 类名”;
这样的SQL语句查询数据库,一次获得所有的数据库.

2.把获得的所有数据对象根据ID放入到第二级缓存中
3.当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存
4.删除 更新 增加数据的时候,同时更新缓存
注: Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用.为此,Hibernate提供了针对条件查询的Query缓存

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 .a)在cfg文件中打开二级缓存
  b)配置使用二级缓存的factory
  c)在 mapping下(引入映射文件)配置要使用二级缓存的类
也可以在hbm文件的class中通过cache标签配置

2.在cfg的同级目录下配置ehcache.xml文件
  a)diskStore:配置缓存磁盘的路径
  b)defaultCache:默认配置
       maxElementsInMemory:允许在内存中缓存的对象个数
       eternal: 缓存是否永久有效
       timeToIdleSeconds: 缓存对象的允许的最大空闲时间
        timeToLiveSeconds: 缓存对象允许的最大存活时间
        overflowToDisk: 超出指定对象个数后是否允许存入磁盘
  c)cache:某个需要缓存的类单独设置

3.使用时,query需要配合setCachable(true)来使用

查询缓存:
  开启查询缓存,如果不开启,每次查询只存主键,开启后可以存其它字段,拿到一条完整的记录.(一般配合二级缓存使用,两个都设置为true).
如果没有开启二级缓存,只开启查询缓存,此时缓存中只存储查询出来的数据id
如果后续再查询相同的数据,根据缓存中的id分条查询数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值