`
ljz0721cx
  • 浏览: 11555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Session 中的缓存机制

阅读更多
Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和查询方法。Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。


       处理持久化状态,对象还能处于游离状态和临时状态,Session的特定方法能使对象从一个状态转换到另一个状态。




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


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


       Session缓存的三大作用:
1、  减少访问数据库的频率。从而提高数据访问的性能。
2、  保证缓存中的对象与数据库中的相关记录保持同步。位于缓存中的对象被称为持久化对象。当缓存中的对象的状态发生了变换,Session并不会立即执行相应的SQL于户,这使得Session能把几条相关的SQL语句合并为一条SQL语句,一边减少访问数据库的次数,从而提高应用程序的性能。
3、  当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由于死循环引起的JVM栈溢出异常。
注:当Session加载了对象后,会为对象的值类型的属性赋值一份快照。当Session清理缓存时,通过比较对象的当前属性和它的快照,Session能够判断对象的哪些属性发生了变化。


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


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


注:Session的commit()和flush()方法的区别。flush方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit方法会先调用flush方法,然后提交事务。提交事务意味着对数据库所作的更新被永久保存下来。

       AUTO时默认值,这也是优先考虑的清理模式,他会保证在整个事务中,数据保持一致。如果事务仅包含查询数据库的操作,而不会修改数据库的数据,也可以选COMMIT模式,这可以避免在执行Session的 查询方法时先清理缓存,以稍微提高应用程序的性能。
       在多说情况下,应用程序不需要显式调用Session的flush方法,flush方法适用于以下场合。
A、插入、删除或更新某个持久化对象会引发数据库中的触发器。
B、 在应用程序中混合使用Hibernate API和JDBC API。
C、 JDBC驱动程序不健壮,导致Hibernate在自动清理缓存的模式下无法正常工作。
 

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


注:持久化类与持久化对象是不同的概念。持久化类的实例可以处于临时状态、持久化状态和游离状态,其中处于持久化状态的实例被称为持久化对象。


1、临时对象的特征
       不处于Session的缓存中(不被任何一个Session实例关联);在数据库中没有对应的记录。
       以下情况下,Java对象进入临时状态:
A、当new语句刚刚创建对象;
B、 Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。


2、持久化对象的特征
       位于一个Session实例的缓存中;持久化对象和数据库中的相应记录对应;Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
       Session的许多方法能触发Java对象转变为持久化对象:
A、save把临时转为持久化状态;
B、 load或get返回的对象总处于持久化状态;
C、 find返回的List集合中存放的都是持久化对象;
D、update、saveOrUpdate和lock方法使游离对象转变为持久化对象;
E、 当一个持久化对象关联一个临时对象,在允许级联保存的情况下,清理缓存时会把临时对象转化为持久化对象。


3、游离对象的特征
       不再位于Session的缓存中;游离对象是由持久化对象转变过来的,因此再数据库中可能存在与它对应的记录(前提是没有其他程序删除这条记录)。
       Session的以下方法使持久化对象转变为游离对象:
A、close方法,缓存被清理空,所有持久化对象都变为于哦里对象;
B、 evict方法能够从缓存中删除一个持久化对象。
 

四、Session的保存、更新、删除和查询方法
1、Session的save方法
       使一个临时的对象转变为持久化对象。
       Session的save方法完成以下操作:
A、把对象加入到缓存中,使它变为持久化对象。
B、 选用映射文件指定的标识符生成器为持久化对象分配唯一的OID。
C、 计划执行一个insert语句,把对象当前的属性值组装到insert语句中。
值得注意的是,save方法并不立即执行SQL insert语句。只有当Session清理缓存时,才会执行语句。


       Session的save方法是用来持久化一个临时对象的。再应用中,不应该把持久化对象或游离对象传给save方法。


2、Session的update方法
       使一个游离对象转变为持久化对象。
       Session的update方法完成以下操作:
A、把对象重新加入到Session的缓存中,使它变为持久化对象。
B、 计划执行一个update语句。(不立即执行,清楚缓存执行)


3、Session的saveOrUpdate方法
       同时包含 了save和update方法的功能,如果传入的参数是临时对象,就调用save方法;如果传入的参数是游离对象,就调用update方法;如果传入的参数是持久化对象,那就直接返回。


4、Session的load和get方法
       根据给定的OID从数据库中加载一个持久化对象,这两个方法的区别在于:当数据库中不存在与OID对应的记录时,load方法抛出异常,而get方法返回null。


5、Session的delete方法
       在数据库中删除与Java对象对应的记录。如果传入的参数时持久化对象,Session就计划执行一个delete语句。如果传入的参数时游离对象,先是的游离对象被Session关联,使它变为持久化对象,然活计划执行一个delete语句。
分享到:
评论

相关推荐

    hibernate的缓存机制和session对象的产生方式案例

    hibernate的缓存机制和session对象的产生方式案例,里面写到session的两种产生方式,和hibernate的缓存机制:一级缓存、二级缓存、查询缓存

    hibernate二级缓存

    提供了缓存的机制,包括一级(Session级)缓存和二级(SessionFactory级)缓存。这里主要总结一下二级缓存。 1.首先需要在hibernate.cfg.xml中配置,当然需要导入缓存的jar包 <property name="hibernate.cache.use_...

    Hibernate缓存深入详解

    Hibernate缓存深入详解,详细介绍Hibernate缓存机制。 1.Hibernate缓存概述 2.Hibernate一级缓存(Session缓存) 3.Hibernate二级缓存 4.查询缓存 5.二级缓存的高级应用(分布式缓存)

    Hibernate的缓存机制.docx

    1、事务范围(单Session即...在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.

    Hibernate 高级配置

    Hibernate高级配置 1. Hibernate与触发器协同工作 1)、触发器使session的缓存中的数据与数据库中...6. Hibernate缓存机制带来的一个负面问题 7. hibernate cache 缓存 8. hibernate缓存方案 9. Hibernate二级缓存配置

    Java框架篇?hibernate之缓存机制

    一、why(为什么要用Hibernate缓存?)  Hibernate是一个持久层框架,经常访问物理数据库。  为了降低应用程序对...  1.Hibernate一级缓存又称为“Session的缓存”。  Session内置不能被卸载,Session的缓存是事

    hibernate基础教程

    一级缓存也就是Session缓存随着Session的关闭而消亡.二级缓存伴随着整个应用,也是就是伴随着SessionFactory消亡而消亡. Hibernate的缓存机构图如下: 三 Hibernate中的第二级缓存 ...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Hibernate+中文文档

    3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下...

    SpringBoot2 整合Ehcache组件,轻量级缓存管理.docx

    Hibernate三级缓存机制简介: 一级缓存 :基于Session级别分配一块缓存空间,缓存访问的对象信息。Session关闭后会自动清除缓存。 二级缓存 :是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二...

    hibernate缓存

    hibernate的缓存机制(redis,manmecache)一级缓存:session级别 二级缓存:sessionFactory级别 (数据量少,数据值固定,经常被访问的数据) 单个对象的缓存,查询缓存:

    hibernate3.2中文文档(chm格式)

    3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    Hibernate中文详细学习文档

    3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下...

    Hibernate 中文 html 帮助文档

    3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下...

    HibernateAPI中文版.chm

    3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下...

    hibernate+中文api

    前言 ...3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

Global site tag (gtag.js) - Google Analytics