SlideShare a Scribd company logo
1 of 21
ORM 框架 —— Hibernate3.3

    Hibernate对象管理和缓存结构
Java 对象在 JVM 中的生命周期

 当应用程序通过 new 关键字创建一个 Java 对象时
  , JVM 会为这个对象分配一块内存空间,只要这
  个对象被引用变量引用,它就一直存在于内存中。
  如果这个对象不被任何引用变量引用,它就结束
  生命周期,此时 JVM 的垃圾回收器就会在适当的
  时候回收它占用的内存。




www.sodi.com.cn
理解 S ession 的缓存

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




www.sodi.com.cn
理解 S ession 的缓存
 Transaction 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);
 // 关闭 Session ,清空缓存
 tx.commit();

 // 访问 Customer 对象
 System.out.println(c2.getName());

 // c2 变量不再引用 Customer 对象,此时 Customer 对象结束生命周期
 c2 = null;


www.sodi.com.cn
S ession 缓存的作用

 减少访问数据库的频率。应用程序从内存中读取
  持久化对象的速度明显比到数据库查询数据的速
  度快多了,因此 S ession 的缓存可以提高数据访问
  的性能。
 保证缓存中的对象与数据库中的相关记录保持同
  步。位于缓存中的对象被称为持久化状态(下面
  会详细介绍),当缓存中持久化对象的状态发生
  了变换, S ession 并不会立即执行相关的 S QL 语句
  ,这使得 S ession 能够将几条相关的 S QL 语句合并
  成一条 S QL 语句,以便减少访问数据库的次数,
  从而提高应用程序的性能。

www.sodi.com.cn
进一步理解 S ession 缓存

Transaction tx = session.beginTransaction();
Customer c1 = (Customer)session.load(Customer.class, 1);
Customer c2 = (Customer)session.load(Customer.class, 1);
System.out.println(c1 == c2);
tx.commit();
// 关闭 Session ,清空缓存
session.close();


    栈                  内存
                    Session 缓存
                                      session.load()
                     Customer                          数据库
    c2
    c1



www.sodi.com.cn
S ession 清理缓存

 S ession 在清理缓存时,按照以下顺序执行 S QL 语
  句:
      按照应用程序调用 session.save( ) 方法的先后顺序,执行
       所有对实体进行插入的 insert 语句。
      执行所有对实体进行更行的 update语句。
      执行所有对集合进行删除的 delete语句。
      执行所有对集合元素进行删除、更新或者插入的 S QL
       语句。
      执行所有对集合进行插入的 insert 语句。
      按照应用程序调用 session.delete( ) 方法的先后顺序,执行
       所有对实体进行删除的 delete语句。


www.sodi.com.cn
清理缓存的时间点

 在默认情况下, S ession 会在下面的时间点清理缓
  存:
      当应用程序调用 net.sf.hibernate.T ransaction 的 commit( ) 方
       法的时候, commit( ) 方法先清理缓存,然后再向数据库
       提交事务。
      当应用程序调用 S ession 的 find( ) 或者 iterate( ) 时,如果
       缓存中持久化对象的属性发生了变化,就会先清理缓存
       ,以保证查询结果能反映持久化对象的最新状态。
      当应用程序显示调用 S ession 的 flush( ) 方法的时候。
 S ession 进行清理缓存的例外情况是:如果对象使用
  native生成器来生成 OI D ,那么当调用 S ession 的
  save( ) 保存该对象时,会立即执行向数据库插入该
  实体的 insert 语句。
www.sodi.com.cn
设定 S ession 清理缓存的时间点

 S ession 的 setFlushMode( ) 方法用于设定清理缓存的
  时间点。 FlushMode类定义了三种不同的清理模式
  : FlushMode.A UTO 、 FlushMode.COMMI T 和
  FlushMode.NE VE R ,具体如下表:
 清理缓存的模           Session 的查询方                            Session 的
                                 Transaction 的 commit()
 式                法                                       flush()
 AUTO             清理             清理                       清理

 COMMIT           不清理            清理                       清理

 NEVER            不清理            不清理                      清理


 FlushMode.A UTO 是默认值,这也是优先考虑的清
  理模式,它会保证在整个事务中,数据保持一致
  。
www.sodi.com.cn
COMMI T 和 NE VE R 清理模式

 如果事务仅包含查询数据库的操作,而不会修改
  数据库的数据,也可以选用 FlushMode.COMMI T
  模式,这可以避免在执行 S ession 的查询方法时先
  清理缓存。
 在多数情况下,应用程序不需要显式调用 S ession
  的 flush( ) 方法, flush( ) 方法适用于以下场合:
      插入、删除或更新某个持久化对象会引发数据库中的触
       发器。
      在应用程序中混合使用 Hibernate A PI 和 JDB C A P I 。
      JDB C 驱动程序不健壮,导致 Hibernate在自动清理缓存
       的模式下无法正常工作。


www.sodi.com.cn
在 Hibernate应用中 Java 对象的状态

 对于需要被持久化的 Java 对象,在它的生命周期
  中,可处于以下三种状态之一:
      临时状态( transient ):刚刚用 new 语句创建,还没有
       被持久化,不处于 S ession 的缓存中。处于临时状态的
       Java 对象被称为临时对象。
      持久化状态( persistent ):已经被持久化,加入到
       S ession 的缓存中。处于持久化状态的 Java 对象被称为持
       久化对象。
      游离状态( detached ):已经被持久化,但不再处于
       S ession 的缓存中。处于游离状态的 Java 对象被称为游离
       对象。



www.sodi.com.cn
临时对象的特征

 临时对象具有以下特征:
      不处于 S ession 的缓存中,也就是说,不被任何一个
       S ession 实例关联。
      在数据库中没有对应的记录。
 在以下情况下, Java 对象进入临时状态:
      当通过 new 语句刚创建了一个 Java 对象,它处于临时状
       态,此时不和数据库中的任何记录对应。
      S ession 的 delete( ) 方法能使一个持久化对象或游离对象转
       变为临时对象。




www.sodi.com.cn
持久化对象的特征

 持久化对象具有以下特征:
      位于一个 S ession 实例的缓存中,也可以说,持久化对象
       总是被一个 S ession 实例关联。
      持久化对象和数据库中的相关记录对应。
      S ession 在清理缓存时,会根据持久化对象的属性变化,
       来同步更新数据库。
 在以下情况下, Java 对象进入持久化状态:
        save( ) 方法把临时对象转变为持久化对象。
        load( ) 或 get( ) 方法返回的对象总是处于持久化状态。
        find( ) 方法返回的 List 集合中存放的都是持久化对象。
        update( ) 、 saveOrUpdate( ) 和 lock( ) 方法使游离对象转变
         为持久化对象。
www.sodi.com.cn
游离对象的特征

 游离对象具有以下特征:
      不再位于 S ession 的缓存中,也就是说,游离对象不被
       S ession 关联。
      游离对象是由持久化对象转变过来的,因此在数据库中
       可能还存在与它对应的记录(前提条件是没有其他程序
       删除了这条记录)。
 在以下情况下, Java 对象进入游离状态:
      当调用 S ession 的 close( ) 方法时, S ession 的缓存被清空,
       缓存中的所有持久化对象都变为游离对象。如果在应用
       程序中没有引用变量引用这些游离对象,他们就会结束
       生命周期。
      S ession 的 evict( ) 方法能够从缓存中删除一个持久化对象
       ,使它变为游离状态。
www.sodi.com.cn
对象的状态转换图




www.sodi.com.cn
Hibernate的二级缓存结构

  Hibernate提供了两级缓存,第一级缓存是 S ession 的
   缓存。由于 S ession 对象的生命周期通常对应一个
   数据库事务或者一个应用事务,因此它的缓存是
   事务范围的缓存。第一级缓存是必须的,不允许
   而且事实上也无法被卸载。在第一级缓存中,持
   久化类的每一个实例都具有唯一的 OI D 。
  第二级缓存是一个可拔插的缓存插件,它由
   S essionFactory 负责管理。由于 S essionFactory 对象的
   生命周期和应用程序的整个进程对应,因此第二
   级缓存是进程范围或群集范围的缓存。这个缓存
   中存放的是对象的散装数据。第二级缓存是可选
   的,可以在每个类或每个集合的粒度上配置二级
   缓存。
www.sodi.com.cn
Hibernate的二级缓存结构

                       Hibernate 的第一级缓存
                           (Session 缓存 )


           Hibernate 的第二级缓存 (SessionFactory 的外置缓存 )


                  缓存并发访问策略             查询缓存




                     缓存适配器 (CatcheProvider)


                             缓存的实现




www.sodi.com.cn
Hibernate的二级缓存机制

 如果在事务范围的缓存中没有查询到相应的数据
  ,还可以到进程范围或群集范围的缓存内查询,
  如果在进程范围或群集范围的缓存内也没有找到
  该数据,那么就只好查询数据库。
                    写
             应用程序         持久化层的第一级缓存
                           ( 事务范围的缓存 )
                    读

                            写     读

                    读
                           持久化层的第二级缓存
              数据库       ( 进程范围或群集范围的缓存 )
                    写

www.sodi.com.cn
配置二级缓存的主要步骤

( 1 ) 选择合适的缓存插件,每一种缓存插件都有
 自带的配置文件,因此需要手动编辑该配置文件
 。

( 2 ) 选择需要使用第二级缓存的持久化类,并设
 置缓存的并发访问策略。 Hibernate既允许在分散
 的各个映射文件中为持久化类设置第二级缓存,
 还允许在 Hibernate的配置文件中集中设置第二级
 缓存,后一种方式更有利于和缓存相关的配置代
 码的维护。


www.sodi.com.cn
Hibernate A PI 对于二级缓存的支
持
 load( ) 默认使用二级缓存
 iterate( ) 默认使用二级缓存
 List 默认往二级缓存中增加数据,但是查询的时候
  不使用
 如果 query 对象要使用二级缓存,需要打开查询缓
  存:
      < property name= “cache.use_query_cache”> true< /proerty>
      调用 Query 的 setCachable( true) 方法指明使用查询缓存




www.sodi.com.cn
www.sodi.com.cn

More Related Content

What's hot (13)

MySQL aio
MySQL aioMySQL aio
MySQL aio
 
Oracle 索引介紹
Oracle 索引介紹Oracle 索引介紹
Oracle 索引介紹
 
Oracle 資料庫建立
Oracle 資料庫建立Oracle 資料庫建立
Oracle 資料庫建立
 
Oracle Tablespace介紹
Oracle Tablespace介紹Oracle Tablespace介紹
Oracle Tablespace介紹
 
【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 z【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 z
 
Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1
 
SCJP ch15
SCJP ch15SCJP ch15
SCJP ch15
 
中软
中软中软
中软
 
2 hibernate核心api
2 hibernate核心api2 hibernate核心api
2 hibernate核心api
 
Oracle 資料庫檔案介紹
Oracle 資料庫檔案介紹Oracle 資料庫檔案介紹
Oracle 資料庫檔案介紹
 
Cvs
CvsCvs
Cvs
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应
 

Viewers also liked

Viewers also liked (17)

11 hibernate 组件映射
11 hibernate 组件映射11 hibernate 组件映射
11 hibernate 组件映射
 
Kommune + unge + sosiale medier = sant
Kommune + unge + sosiale medier = santKommune + unge + sosiale medier = sant
Kommune + unge + sosiale medier = sant
 
VG og unge brukere
VG og unge brukere VG og unge brukere
VG og unge brukere
 
9 hibernate 一对多关系映射
9 hibernate 一对多关系映射9 hibernate 一对多关系映射
9 hibernate 一对多关系映射
 
8 hibernate 一对一关系映射
8 hibernate 一对一关系映射8 hibernate 一对一关系映射
8 hibernate 一对一关系映射
 
3 hibernate映射元素和类型
3 hibernate映射元素和类型3 hibernate映射元素和类型
3 hibernate映射元素和类型
 
7 hibernate最佳实践
7 hibernate最佳实践7 hibernate最佳实践
7 hibernate最佳实践
 
12 hibernate 集合映射
12 hibernate 集合映射12 hibernate 集合映射
12 hibernate 集合映射
 
01 orm概述及持久化介绍
01 orm概述及持久化介绍01 orm概述及持久化介绍
01 orm概述及持久化介绍
 
10 hibernate 多对多关系映射
10 hibernate 多对多关系映射10 hibernate 多对多关系映射
10 hibernate 多对多关系映射
 
6 事务和并发控制
6 事务和并发控制6 事务和并发控制
6 事务和并发控制
 
15 hibernate hql查询2
15 hibernate hql查询215 hibernate hql查询2
15 hibernate hql查询2
 
Plan - innovative måter å møte unge på
Plan - innovative måter å møte unge påPlan - innovative måter å møte unge på
Plan - innovative måter å møte unge på
 
13 hibernate 继承映射
13 hibernate 继承映射13 hibernate 继承映射
13 hibernate 继承映射
 
16 hibernate criteria查询
16 hibernate criteria查询16 hibernate criteria查询
16 hibernate criteria查询
 
youth civic engagement in social media
youth civic engagement in social mediayouth civic engagement in social media
youth civic engagement in social media
 
14 hibernate hql查询1
14 hibernate hql查询114 hibernate hql查询1
14 hibernate hql查询1
 

Similar to 4 hibernate对象管理和缓存结构

Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作
yiditushe
 
Enqueue Lock介绍.ppt
Enqueue Lock介绍.pptEnqueue Lock介绍.ppt
Enqueue Lock介绍.ppt
james tong
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler API
Lixun Peng
 
Times Ten Training
Times Ten TrainingTimes Ten Training
Times Ten Training
Li Chen
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 

Similar to 4 hibernate对象管理和缓存结构 (20)

组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
第8章 运行时的存储管理
第8章 运行时的存储管理第8章 运行时的存储管理
第8章 运行时的存储管理
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程
 
Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作
 
Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
 
Enqueue Lock介绍.ppt
Enqueue Lock介绍.pptEnqueue Lock介绍.ppt
Enqueue Lock介绍.ppt
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
缓存技术浅谈
缓存技术浅谈缓存技术浅谈
缓存技术浅谈
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler API
 
Times Ten Training
Times Ten TrainingTimes Ten Training
Times Ten Training
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
RockStor - A Cloud Object System based on Hadoop
RockStor -  A Cloud Object System based on HadoopRockStor -  A Cloud Object System based on Hadoop
RockStor - A Cloud Object System based on Hadoop
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典
 

4 hibernate对象管理和缓存结构

  • 1. ORM 框架 —— Hibernate3.3 Hibernate对象管理和缓存结构
  • 2. Java 对象在 JVM 中的生命周期  当应用程序通过 new 关键字创建一个 Java 对象时 , JVM 会为这个对象分配一块内存空间,只要这 个对象被引用变量引用,它就一直存在于内存中。 如果这个对象不被任何引用变量引用,它就结束 生命周期,此时 JVM 的垃圾回收器就会在适当的 时候回收它占用的内存。 www.sodi.com.cn
  • 3. 理解 S ession 的缓存  当 S ession 的 save( ) 方法持久化一个 Custom 对象时 er , Custom 对象被加入到 S ession 的缓存中,以后 er 即使应用程序中的引用变量不再引用 Custom 对象 er ,只要 S ession 的缓存还没有被清空, Custom 对 er 象仍然处于生命周期中。  当 S ession 的 load( ) 方法试图从数据库中加载一个 Custom 对象时, S ession 先判断缓存中是否已经存 er 在这个 Custom 对象,如果存在,就不需要再到数 er 据库中检索。 www.sodi.com.cn
  • 4. 理解 S ession 的缓存 Transaction 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); // 关闭 Session ,清空缓存 tx.commit(); // 访问 Customer 对象 System.out.println(c2.getName()); // c2 变量不再引用 Customer 对象,此时 Customer 对象结束生命周期 c2 = null; www.sodi.com.cn
  • 5. S ession 缓存的作用  减少访问数据库的频率。应用程序从内存中读取 持久化对象的速度明显比到数据库查询数据的速 度快多了,因此 S ession 的缓存可以提高数据访问 的性能。  保证缓存中的对象与数据库中的相关记录保持同 步。位于缓存中的对象被称为持久化状态(下面 会详细介绍),当缓存中持久化对象的状态发生 了变换, S ession 并不会立即执行相关的 S QL 语句 ,这使得 S ession 能够将几条相关的 S QL 语句合并 成一条 S QL 语句,以便减少访问数据库的次数, 从而提高应用程序的性能。 www.sodi.com.cn
  • 6. 进一步理解 S ession 缓存 Transaction tx = session.beginTransaction(); Customer c1 = (Customer)session.load(Customer.class, 1); Customer c2 = (Customer)session.load(Customer.class, 1); System.out.println(c1 == c2); tx.commit(); // 关闭 Session ,清空缓存 session.close(); 栈 内存 Session 缓存 session.load() Customer 数据库 c2 c1 www.sodi.com.cn
  • 7. S ession 清理缓存  S ession 在清理缓存时,按照以下顺序执行 S QL 语 句:  按照应用程序调用 session.save( ) 方法的先后顺序,执行 所有对实体进行插入的 insert 语句。  执行所有对实体进行更行的 update语句。  执行所有对集合进行删除的 delete语句。  执行所有对集合元素进行删除、更新或者插入的 S QL 语句。  执行所有对集合进行插入的 insert 语句。  按照应用程序调用 session.delete( ) 方法的先后顺序,执行 所有对实体进行删除的 delete语句。 www.sodi.com.cn
  • 8. 清理缓存的时间点  在默认情况下, S ession 会在下面的时间点清理缓 存:  当应用程序调用 net.sf.hibernate.T ransaction 的 commit( ) 方 法的时候, commit( ) 方法先清理缓存,然后再向数据库 提交事务。  当应用程序调用 S ession 的 find( ) 或者 iterate( ) 时,如果 缓存中持久化对象的属性发生了变化,就会先清理缓存 ,以保证查询结果能反映持久化对象的最新状态。  当应用程序显示调用 S ession 的 flush( ) 方法的时候。  S ession 进行清理缓存的例外情况是:如果对象使用 native生成器来生成 OI D ,那么当调用 S ession 的 save( ) 保存该对象时,会立即执行向数据库插入该 实体的 insert 语句。 www.sodi.com.cn
  • 9. 设定 S ession 清理缓存的时间点  S ession 的 setFlushMode( ) 方法用于设定清理缓存的 时间点。 FlushMode类定义了三种不同的清理模式 : FlushMode.A UTO 、 FlushMode.COMMI T 和 FlushMode.NE VE R ,具体如下表: 清理缓存的模 Session 的查询方 Session 的 Transaction 的 commit() 式 法 flush() AUTO 清理 清理 清理 COMMIT 不清理 清理 清理 NEVER 不清理 不清理 清理  FlushMode.A UTO 是默认值,这也是优先考虑的清 理模式,它会保证在整个事务中,数据保持一致 。 www.sodi.com.cn
  • 10. COMMI T 和 NE VE R 清理模式  如果事务仅包含查询数据库的操作,而不会修改 数据库的数据,也可以选用 FlushMode.COMMI T 模式,这可以避免在执行 S ession 的查询方法时先 清理缓存。  在多数情况下,应用程序不需要显式调用 S ession 的 flush( ) 方法, flush( ) 方法适用于以下场合:  插入、删除或更新某个持久化对象会引发数据库中的触 发器。  在应用程序中混合使用 Hibernate A PI 和 JDB C A P I 。  JDB C 驱动程序不健壮,导致 Hibernate在自动清理缓存 的模式下无法正常工作。 www.sodi.com.cn
  • 11. 在 Hibernate应用中 Java 对象的状态  对于需要被持久化的 Java 对象,在它的生命周期 中,可处于以下三种状态之一:  临时状态( transient ):刚刚用 new 语句创建,还没有 被持久化,不处于 S ession 的缓存中。处于临时状态的 Java 对象被称为临时对象。  持久化状态( persistent ):已经被持久化,加入到 S ession 的缓存中。处于持久化状态的 Java 对象被称为持 久化对象。  游离状态( detached ):已经被持久化,但不再处于 S ession 的缓存中。处于游离状态的 Java 对象被称为游离 对象。 www.sodi.com.cn
  • 12. 临时对象的特征  临时对象具有以下特征:  不处于 S ession 的缓存中,也就是说,不被任何一个 S ession 实例关联。  在数据库中没有对应的记录。  在以下情况下, Java 对象进入临时状态:  当通过 new 语句刚创建了一个 Java 对象,它处于临时状 态,此时不和数据库中的任何记录对应。  S ession 的 delete( ) 方法能使一个持久化对象或游离对象转 变为临时对象。 www.sodi.com.cn
  • 13. 持久化对象的特征  持久化对象具有以下特征:  位于一个 S ession 实例的缓存中,也可以说,持久化对象 总是被一个 S ession 实例关联。  持久化对象和数据库中的相关记录对应。  S ession 在清理缓存时,会根据持久化对象的属性变化, 来同步更新数据库。  在以下情况下, Java 对象进入持久化状态:  save( ) 方法把临时对象转变为持久化对象。  load( ) 或 get( ) 方法返回的对象总是处于持久化状态。  find( ) 方法返回的 List 集合中存放的都是持久化对象。  update( ) 、 saveOrUpdate( ) 和 lock( ) 方法使游离对象转变 为持久化对象。 www.sodi.com.cn
  • 14. 游离对象的特征  游离对象具有以下特征:  不再位于 S ession 的缓存中,也就是说,游离对象不被 S ession 关联。  游离对象是由持久化对象转变过来的,因此在数据库中 可能还存在与它对应的记录(前提条件是没有其他程序 删除了这条记录)。  在以下情况下, Java 对象进入游离状态:  当调用 S ession 的 close( ) 方法时, S ession 的缓存被清空, 缓存中的所有持久化对象都变为游离对象。如果在应用 程序中没有引用变量引用这些游离对象,他们就会结束 生命周期。  S ession 的 evict( ) 方法能够从缓存中删除一个持久化对象 ,使它变为游离状态。 www.sodi.com.cn
  • 16. Hibernate的二级缓存结构  Hibernate提供了两级缓存,第一级缓存是 S ession 的 缓存。由于 S ession 对象的生命周期通常对应一个 数据库事务或者一个应用事务,因此它的缓存是 事务范围的缓存。第一级缓存是必须的,不允许 而且事实上也无法被卸载。在第一级缓存中,持 久化类的每一个实例都具有唯一的 OI D 。  第二级缓存是一个可拔插的缓存插件,它由 S essionFactory 负责管理。由于 S essionFactory 对象的 生命周期和应用程序的整个进程对应,因此第二 级缓存是进程范围或群集范围的缓存。这个缓存 中存放的是对象的散装数据。第二级缓存是可选 的,可以在每个类或每个集合的粒度上配置二级 缓存。 www.sodi.com.cn
  • 17. Hibernate的二级缓存结构 Hibernate 的第一级缓存 (Session 缓存 ) Hibernate 的第二级缓存 (SessionFactory 的外置缓存 ) 缓存并发访问策略 查询缓存 缓存适配器 (CatcheProvider) 缓存的实现 www.sodi.com.cn
  • 18. Hibernate的二级缓存机制  如果在事务范围的缓存中没有查询到相应的数据 ,还可以到进程范围或群集范围的缓存内查询, 如果在进程范围或群集范围的缓存内也没有找到 该数据,那么就只好查询数据库。 写 应用程序 持久化层的第一级缓存 ( 事务范围的缓存 ) 读 写 读 读 持久化层的第二级缓存 数据库 ( 进程范围或群集范围的缓存 ) 写 www.sodi.com.cn
  • 19. 配置二级缓存的主要步骤 ( 1 ) 选择合适的缓存插件,每一种缓存插件都有 自带的配置文件,因此需要手动编辑该配置文件 。 ( 2 ) 选择需要使用第二级缓存的持久化类,并设 置缓存的并发访问策略。 Hibernate既允许在分散 的各个映射文件中为持久化类设置第二级缓存, 还允许在 Hibernate的配置文件中集中设置第二级 缓存,后一种方式更有利于和缓存相关的配置代 码的维护。 www.sodi.com.cn
  • 20. Hibernate A PI 对于二级缓存的支 持  load( ) 默认使用二级缓存  iterate( ) 默认使用二级缓存  List 默认往二级缓存中增加数据,但是查询的时候 不使用  如果 query 对象要使用二级缓存,需要打开查询缓 存:  < property name= “cache.use_query_cache”> true< /proerty>  调用 Query 的 setCachable( true) 方法指明使用查询缓存 www.sodi.com.cn

Editor's Notes

  1. 讲的时候可以参考《精通 Hibernate 》 P176 的图。
  2. 上面的程序为 Customer 对象的 name 属性修改了两次,当 Session 清理缓存时,只需要执行一条 update 语句。