Hibernate缓存及延迟加载

“缓存”在提高系统性能方面发挥着重要的作用。其基本实现原理:将原始数据通过一定的算法,将其备份并保存到新的媒介中,使其访问速度远远高于原始数据的访问数据。通常情况下,其介质一般是内存,所以读写速度非常块。

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语句。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值