一、一级缓存的概念
一级缓存被称为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