“缓存”在提高系统性能方面发挥着重要的作用。其基本实现原理:将原始数据通过一定的算法,将其备份并保存到新的媒介中,使其访问速度远远高于原始数据的访问数据。通常情况下,其介质一般是内存,所以读写速度非常块。
Hibernate框架也应用了缓存技术,并实现了两级缓存,一级缓存即Session的缓存,二级缓存即SessionFactory的缓存。
1、一级缓存
一级缓存是Session级的缓存,其生命周期很短,与Session相互对应。一级缓存由Hibernate进行管理,属于事务范围的缓存。
当程序调用Session的load()方法、get()方法、save()方法、saveOrUpdate()方法、update()方法或查询接口方法时,Hibernate会对实体对象进行缓存;当通过load()方法或get()方法查询实体对象时,Hibernate会首先到缓存中查找,在找不到实体对象的情况下,Hibernate才会发出SQL语句到数据库中查询,从而提高了Hibernate的使用效率。
例:如果在同一Session中连续两次查询同一对象,由于一级缓存的存在,Hibernate只发出一条SQL语句。
注:一级缓存的生命周期与Session相对应,它并不会在Session之间共享,在不同的Session中不能得到其它Session中缓存的实体对象。
2、二级缓存
二级缓存是SessionFactory级的缓存,其生命周期与SessionFactory一致。二级缓存可以在多个Session之间共享,属于进程范围或群集范围的缓存。
二级缓存是一个可插拔的缓存插件,它的使用需要第三方缓存产品的支持。在Hibernate框架中,通过Hibernate配置文件配置二级缓存的使用策略。
注:对于二级缓存,可以使用一些不经常更新的数据或参考的数据,此时其性能会得到明显的提升。例如一个新闻网站,当发布一条热点新闻时,会有成千上万的访问量,而此条新闻并没有发生任何的变化,如果每一个用户访问都要查询数据库,势必对系统性能造成一定的影响,此时可以考虑应用二级缓存。如果经常变换的数据则不应应用二级缓存。
3、Lazy策略
Lazy策略为延迟加载策略,Hibernate通过JDK代理对其进行实现,即使用延迟加载的对象,在获取对象的时候返回的是对象的代理,并不是对象的真正引用,只有在对象真正被调用的时候,Hibernate才会对其进行查询,返回真正的对象。
这在某种程度上对性能起到一定的优化。Hibernate的延迟加载还可以减少程序与数据库的连接次数,因为使用了延迟加载,Hibernate将延缓执行SQL语句,减少对数据库的访问次数,从而提高执行效率。
例://第一个session
Session.beginTransaction();
User user=(User)session.load(User.class, new Integer(1));
session.getTransaction.commit();
//第二个session
Session.beginTransaction();
User user=(User)session.load(User.class, new Integer(1));
System.out.println("name="+user.getName());
session.getTransaction.commit();
解释:实例中开启了两个session对象,两次均使用了load()方法查询,在第一次查询中,对于查询到的对象并没有任何引用,所以Hibernate不会发出SQL语句;而第二次查询中,实例输出了user对象的名称属性,对查询后的对象进行引用,因此此时Hibernate会发出一条SQL语句。