缓存,对象在持久层的三种状态.doc_第1页
缓存,对象在持久层的三种状态.doc_第2页
缓存,对象在持久层的三种状态.doc_第3页
缓存,对象在持久层的三种状态.doc_第4页
缓存,对象在持久层的三种状态.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

对象在持久层的三种状态(面试时经常问)一、session缓存(面试时经常问)(一)Session缓存的作用:Session.save()吃就换一个Customer对象时,把Customer对象放入session缓存中,以后即便是程序中引用变量不再引用Customer对象,只要Session缓存还没有清空,Customer对象依然处于生命周期中。好处:1、 减少访问数据库的频率。2、 保证缓存中的对象与数据库中的相关的记录一致3、 清理缓存是指按照缓存中的对象的状态的变化来同步更新数据的。(二)Session缓存清理的时间点:1、当应用程序调用org.hiberante.Transaction的commit()方法时候,commit()先清理缓存再向数据库提交事务。2、当应用程序调用session中的flush()方法时候二、hibernate缓存的种类(面试时经常问)(一)、Session:一级缓存,不可改,必须使用。由于Session对象的生命周期,通常对应一个数据库事务或者一个应用事务,因此session缓存是事务范围内的缓存。一级缓存是必须的,而且不允许修改也无法别卸载,持久化类每个对象实例都要有唯一的OID(主键ID)。(二)、SessionFactory:二级缓存,可改,可拔插。它是由SessionFactory进行管理的。SessionFactory的生命周期和整个应用程序的生命周对应。因此SessionFactory缓存称为进程范围的缓存。可选,可以针对某个集合粒度上配置二级缓存。Hiberante的第一级缓存(session缓存)Hiberante的第二级缓存(SessionFacory缓存)缓存并发访问策略。查询缓存。缓存适配器(CahceProvider)缓存的实现三、对象在持久层的三种状态(面试时经常问)1、临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于session的缓存中。处于临时状态。临时对象。2、持久化状态(persustent):已经被持久化,加入到session的缓存中(没有到数据库中)。持久化对象。3、游离状态(detached):已经被持久化,但不处于session的缓存中(不一定到数据库中)。游离对象。临时状态持久化状态Save()/saveOrUpdate() delete() delete() evict()/close()/clear() update/saveOrUpdate游离状态 lock()例子:/Category对象开始生命周tx=session.beginTransaction();/临时状态Category category1=new Category(level1,null,new HashSet();/Category cateory=(Category)session.get(Category.class, 1);/转变为持久化状态session.save(category1);/处于持久化状态Category cateory=(Category)session.get(Category.class, 1);/转变为游离状态session.close();/处于游离状态cateory.getName();/结束生命周期cateory=null;四、Hibernate的检索策略 (一)、立即检索(查询所有Customer(4条数据),Oreders的数据)List customerLists=session.createQuery(“From Customer as c”).list();Select * from customerSelect * from Oreders where Customer_id=1;Select * from Oreders where Customer_id=2;Select * from Oreders where Customer_id=3;Select * from Oreders where Customer_id=4;缺点:1、 select语句太多,需要频繁访问数据库影响检索性能。2、 以上查询可以用左外连接去查询Select * from Customer as c left outer join Oreders as o onc.id=o. Customer_id3、只需要访问Customer对象,不需要访问Oreders对象。这个时候就会影响性能。(二)、延迟检索在一对多关联级别使用延迟检索策略,解决立即检索缺点。配置:set name=”order” inverse=”true” lazy=”true”运行:Customer cutomer=( Customer)session.get(Customer.class,1);就会延迟检索,只发出查询Customer语句:Select * from customer where id=1;1、优点不会发出多余的sql语句。2、缺点如果希望访问跟查询类相关的游离状态的对象,就访问不到。3、适用范围一对多或者多对多关联在应用程序不需要立即访问或者根本不会访问的对象。(三)、左外连接检索优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以很方便的从一个对象导航到与它相关的对象。使用外连接,sql语句减少。缺点:加载应用程序不需要访问到的对象,浪费内存空间。复杂的sql内连接语句会影响检索性能。适用范围:多对一,一对一应用程序立即需要访问的对象。实例:五、一对一关联(学生Student和学号IdCard)1、一对一默认使用立即加载,如果需要延迟加载,那么需要在one-to-one

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论