精通Hibernate——理解HibernateSession缓存

news/2024/6/29 12:20:30 标签: hibernate, session, 缓存

如何希望一个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方法时


http://www.niftyadmin.cn/n/1454737.html

相关文章

uva 10759 - Dice Throwing(dp)

题目链接:uva 10759 - Dice Throwing 题目大意:给出n和x,计算在丢n个色子,出现的点数大于等于x的概率,要求分式最简。 解题思路:一开始方向想错了,一直在枚举num[i][j], i表示i个色子丢出的点数…

SY0-201 真题分享

SY0-201 认证题库 CompTIA Security(2008 Edition) Exam科目编号 : SY0-201 题库名称 : CompTIA Security(2008 Edition) Exam 考题数目 : 469 Q&As 更新时间: 2009-12-10数量问题: 100 长度测试: 90分钟 语言: 英语,西班牙语…

深入理解JVM:OutOfMemory实战

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM),下面我们来详细分析。 Java堆溢出 Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来…

uva 10791 - Minimum Sum LCM(分解因子)

题目大意:uva 10791 - Minimum Sum LCM 题目大意:给出一个n,将n分解成n p1 ^ k1 * p2 ^ k2 * ... * pm ^ km,然后求解sum ∑(1≤i≤m)pi ^ ki. 解题思路:比较费解的是n本身就是素数,那么n应该分解成n^ 1 …

[转载]《博客园精华集》LINQ筛选结果(共33篇)

引爆你的集合灵感 [C#, LINQ] 作者:Allen LeeYU-GI-OH! POWER OF XLINQ [C#, XLINQ, XML] 作者:Allen LeeLINQ体验(1)——Visual Studio 2008新特性 作者:李永京LINQ体验(2)——C# 3.0新语言特性和改进(上篇) 作者:李永京LINQ体验…

精通Hibernate——Hibernate中Java对象的状态详解

Hibernate中对于要持久化的Java对象在他的生命周期中需要经历以下几种状态: 1、临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于session的缓存中。处于临时状态的Java对象被称为临时对象。 2、持久化状态&#xf…

uva 10717 - Mint(欧几里得求最小公倍数)

题目链接:uva 10717 - Mint 题目大意:给出n和m,然后给出n种硬币的的厚度,现在在给出m个桌子的高度,要求对应每个桌子high,输出两个值,从n种硬币中选取4种,每一种硬币用若干个叠在一起…

c# excel 示例2

DataTable中的数据导出Excel文件/** <summary> /// 将DataTable中的数据导出到指定的Excel文件中 /// </summary> /// <param name"page">Web页面对象</param> /// <param name"tab">包含被导出数据的DataTable对象<…