精通Hibernate——理解HibernateSession缓存

如何希望一个Java对象一直处于生命周期中,就必须保证至少有一个变量引用他,或者在一个Java集合中存放了这个对象的引用。在session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合构成了session的缓存。例如:

private final Map entitiesByKey;
//....
entitiesByKey.put(key,Object);// 向session缓存中加入一个持久化对象
//....
entitiesByKey.remove(key);// 从session的缓存中删除一个持久化对象
entitiesByKey.clear();

当session的save方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中。当Session的load()方法试图从数据库中加载一个Customer对象时,Session的load方法试图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,如果存在就不需要去数据库中查询。

tx = session.beginTransaction();
Customer c1 = new Customer("tom",new HashSet());
// Customer对象被持久化,并且加入到Session的缓存中
session.save(c1);
Long id = c1.getId();
// c1变量不再引用Customer对象
c1 = null;
// 从Session缓存中读取Customer对象,使c2变量引用Customer对象
Customer c2 = (Customer)session.load(Customer.class,id);
tx.commit();
// 关闭session,情况缓存
session.close();
// c2变量不再引用Customer对象,此时Customer对象结束生命周期
c2 = null;

当调用session.save()方法时,Customer对象被加入到缓存中,接下来引用变量c1置为null,但是Customer仍然在session缓存中,因此它的生命周期并没有结束,当调用session的load方法再加载此对象时,只需从缓存中读取Customer对象,而不需要到数据库中重新加载。
当session关闭时,session缓存被清空,但是变量c2仍然引用Customer对象,所以Customer仍然处于生命周期中。当程序代码最后把c2变量置为null,此时Customer对象不被任何变量或者缓存引用,这时,他才结束生命周期。
session缓存的两大作用:
1、减少数据库访问的频率,提高数据访问的性能
2、保证缓存中的对象与数据库中的相关记录保持同步。
3、当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。
以下几种情况会清理Session缓存:
1、应用程序调用net.sf.hibernate.Transaction的commit方法的时候,从commit方法先清理缓存,然后再向数据库提交事务。
2、当应用程序调用session的find或者iterate时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反应持久化对象是最新的。
3、当应用程序显式调用session的flush方法时

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值