浅谈hibernate的缓存和快照

最近开始学习hibernate框架,这是一个基于持久层的框架,是ORM思想的一种实现技术,主要解决的问题是如何把对象的数据直接保存到数据库和如何直接从数据库中取出一个对象,在学习session缓存和快照时,有点难以理解他们的运行机制,所以在这里将hibernate中三个比较重要的概念总结一下。

hibernate存在2个缓存
* 第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存(session的一级缓存)
* 第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存(二级缓存)

session的一级缓存
* 使用hibernate进行查询的时候,将查询结果放置到session的一级缓存中,在一级缓存中存在对象,对象使用属性的OID的值进行区分,此时再使用相同的OID进行查询的时候,首先会在session一级缓存中进行查找是否存在相同的OID
* 如果存在相同的OID,此时不再查询数据库,而是直接使用一级缓存中存在的对象
* 如果没有存在相同的OID,此时再查询数据库,将查询得到的结果数据再放置到session一级缓存中
目的:减少访问数据库的次数

session的快照
* 使用id进行查询数据库,将查询得到的结果放置到session一级缓存中,同时复制一份数据,放置到session的快照中
* 当使用tr.commit()的时候,同时清理session的一级缓存(flush)
* 当清理session一级缓存的时候,会使用OID判断一级缓存中对象和快照中的对象进行比对
* 如果2个对象(一级缓存的对象和快照的对象)中的属性发生变化,则执行update语句,此时更新数据库,更新成一级缓存中的数据
* 如果2个对象中的属性不发生变化,此时不执行update语句
目的:确保和数据库中的数据一致

Session二级缓存
一个可配置的缓存插件包括类级别的缓存区域,集合级别的缓存区域,查询级别的缓存区域,时间戳级别的缓存区域
其使用步骤大致如下:
1 拷贝ehcache-1.5.0.jar到当前工程的lib目录下
2 开启二级缓存

<property name="hibernate.cache.use_second_level_cache">true</property>

3 要指定缓存的供应商

 <property name="hibernate.cache.provider_class">
              org.hibernate.cache.EhCacheProvider</property>

4 指定使用二级缓存的类
* 方法一 在使用类的*.hbm.xml配置
选择需要使用二级缓存的持久化类, 设置它的二级缓存的并发访问策略, class 元素的 cache 子元素表明 Hibernate 会缓存对象的简单属性, 但不会缓存集合属性, 若希望缓存集合属性中的元素, 必须在 元素中加入 cache 子元素
方法二 在hibernate.cfg.xml文件中配置(建议)

      <!-- 指定使用二级缓存的类放在maping下面 -->
      <!-- 配置类级别的二级缓存 -->
      <class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/>
      <class-cache class="cn.itcast.c3p0.Order" usage="read-write"/>
    <!-- 配置集合级别的二级缓存 -->
    <collection-cache  collection="cn.itcast.c3p0.Customer.orders" usage="read-write"/>

5 配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值