Hibernate (五)一级缓存

一、一级缓存的概念    

    一级缓存被称为Session级别的缓存:每个Session都有自己独立的缓存区,该缓存区随着Session创建而开辟(由SessionFactory创建),随着Session.close()而释放。hibernate的一级缓存是session所内置的,默认开启,不能被卸载,也不能进行任何配置。在缓存中的对象,具有持久性,session对象负责管理。该缓存区可以存储当前Session关联的持久对象。只有在缓存区中,Session才管该对象。一级缓存采用的是Key-Value的MAP方式来实现的。在缓存实体对象时,对象的主关键字ID是MAP的Key,实体对象就是对象的值。所以说一级缓存是以实体对象为单位进行存储的。访问的时候使用的是主键关键字ID。一级缓存使用的是自动维护的功能。但可以通过session提供的手动方法对一级缓存的管理进行手动干预。

二、一级缓存的好处

    Hibernate在查询时,先去缓存当中查找,如果缓存中没有,才去数据库查询。如果利用Session对同一个对象查询多次,第一次去数据库查,后续的会从缓存查询,从而减少了与数据库的交互次数。

三、一级缓存常用操作

1)session.evict()方法:将对象清除。
2)session.clear()方法:清除所有对象。
3)session.close()方法:清除所有对象,并关闭与数据库的连接。

四、获取session对象

    首先创建SessionFactory对象,如果访问多个数据源时,则应该产生多个SessionFactory;但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源,然后根据SessionFactory再创建Session对象。

Session session=factory.openSession();
    Transaction ts = null;
    try {
      ts=session.beginTransaction(); //开始一个事务
      //TODO                      //执行事务
      ts.commit();                           //提交事务
    } catch (HibernateException e) {     //如果出现异常就撤销事务
      if(ts!=null){
        ts.rollback();                        //回滚事务
      }
      e.printStackTrace();
    } finally{
      session.close();//不管事务执行成功与否,最后都关闭Session并且放在finally中以提高安全性
    }
    Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口list,filter,iterate时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除。Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置。

    因为Session的生命期往往很短,存在于Session内部的最快缓存的生命期当然也很短,所以第一级缓存的命中率是很低的。其对系统性能的改善也是很有限的。当然,这个Session内部缓存的主要作用是保持Session内部数据状态同步。并非是hibernate为了大幅提高系统性能所提供的。为了提高使用hibernate的性能,除了常规的一些需要注意的方法比如:使用延迟加载、迫切外连接、查询过滤等以外,还需要配hibernate的二级缓存。


参考文章:http://dododo1234321-163-com.iteye.com/blog/1828173




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值