Hibernate缓存、对象状态.ppt_第1页
Hibernate缓存、对象状态.ppt_第2页
Hibernate缓存、对象状态.ppt_第3页
Hibernate缓存、对象状态.ppt_第4页
Hibernate缓存、对象状态.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章,Hibernate缓存、对象状态,回顾,HQL的全称是? 和SQL相比,HQL有哪些特点? HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用?做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria查询对象?,预习检查,Hibernate有几种缓存机制? Hibernate的几种缓存机制各是什么?,理解Hibrnate的缓存机制 理解对象的状态,本章目标,Hibernate的缓存分为: 一级缓存,单个会话的对象缓存。 二级缓存,可插拔的缓存插件,Hibernate的缓存,当Session加

2、载或保存一个对象时,如果Session的缓存中不存在相应的对象,hibernate就会把该对象加入到一级缓存中。 当再次通过Session加载相同OID的对象时,Hibernate将直接从Session的缓存中获取。 当Session关闭时,缓存将被清空。,/第一次加载时将产生SQL访问数据库 Customer cusa = (Customer)session.get(Customer.class, 1l); /第二次加载同样的Customer时Hibernate将从Session中获取 Customer cusb = (Customer)session.get(Customer.class,

3、 1l); /cusa和cusb应当是同一对象 If(cusa = cusb)System.out.println(“同一个对象!”); /缓存被清空 session.close();,理解Session缓存,减少访问数据库的频率。 应用程序从内存中获取对象明显快于从数据库中查找。 保证缓存中的对象与数据库相关的记录同步。 当处于缓存中的对象的属性发生改变时,Session不会立即更新数据库,它可以将多次更新合并处理后产生一条更新语句。,Customer customer = (Customer)session.get(Customer.class, 1); customer.setName(

4、jack); customer.setName(mike); session.update(customer); /以上只会产生一条sql语句。 update Customer set name = mike .,Session缓存的作用,Hibernate会在特定的时间自动同步缓存与数据库 当人为提交事务时,commit()方法先清理缓存,然后再向数据库提交事务。 当执行session的查询方法时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。 当执行session.flush时,注意:关闭Session时,Hibernate不会执行缓存同步

5、。,同步Session缓存,evict(Object o): 从缓存中清除指定的对象 clear(): 清空缓存中的所有对象,管理一级缓存,二级缓存是一个可以插拔的缓存插件,它由SessionFactory负责管理,由于SessionFactory对象的生命周期和应用程序的生命周期对应,因此二级缓存是进程范围或群集范围的缓存。 缓存中存放的是对象的散装数据而不是对对象的引用。可以被一个SessionFactory的所有sesison共享 二级缓存是可选的,可以在每个类或每个集合的粒度上配置二级缓存。,Hibernate二级缓存,应用程序,一级缓存 (事务范围内的Session缓存),二级缓存

6、(进程范围或群集范围的缓存),数据库,写,读,写,读,如果在事务范围的缓存(第1级缓存)中没有查询到相应的数据,还可以到进程范围或群集范围的缓存(第2级缓存)内查询,如果在进程范围或群集范围的缓存内也没有找到该数据,那么就只好查询数据库。,Hibernate二级缓存的执行机制,二级缓存是可配置的插件,Hibernate允许选用以下类型的缓存插件 EHCache OSCache SwarmCache JBossCache 这些插件都是由第三方提供的。 Hibernate2以前提倡用 EHCache Hibernate3后提倡用OSCache,Hibernate二级缓存的第三方实现,把oscach

7、e-2.1.jar加入到当前应用的classpath中。 修改hibernate.cfg.xml文件开启二级缓存。 true org.hibernate.cache.OSCacheProvider true ,使用OSCache配置二级缓存,挎贝perties文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。 关于缓存中存放多少数据,Hibernate是不关心的,全部由OSCache来完成。在perties中,有如下的参数配置:cache.capacity=1000 这个数值代表放入缓存的对象数量,这个数量根据用

8、户机器的内存来配置,一般只需要配置这个参数即可。,使用OSCache配置二级缓存,指定哪些实体类使用缓存。经过第一步缓存是启用了,但是并没有被使用。它不会去自动把所有的实体都进行缓存了,而是需要手动指定哪个实体需要缓存,以及其缓存的策略。这里有两种方式, 第一种是修改要使用缓存的实体的映射文件。如在User.hbm.xml中使用标签启用。 ,使用OSCache配置二级缓存,第二种方式是在hibernate.cfg.xml中使用 标签指定实体类并启用。 true org.hibernate.cache.OSCacheProvider ,使用OSCache配置二级缓存,read-only缓存的对象

9、只可以读取。 read-write缓存的对象可读写。 nonstrict-read-write非严格的读写,适合于并发更新的情况非常小(会出现一定的错误数据,即不同步数据)。 transaction事务缓存,可支持事务回滚(OSCache中没有此项功能)。,二级缓存策略-usage设定,把ehcache-1.2.3.jar加入到当前应用的classpath中。 修改hibernate.cfg.xml文件开启二级缓存。 true org.hibernate.cache.EhCacheProvider true ,使用EhCache配置二级缓存,挎贝ehcache.xml文件到类路径(项目工程的s

10、rc目录下),这个文件在Hibernate安装目录的etc下。内容如下: ,使用EhCache配置二级缓存,指定哪些实体类使用缓存。经过第一步缓存是启用了,但是并没有被使用。它不会去自动把所有的实体都进行缓存了,而是需要手动指定哪个实体需要缓存,以及其缓存的策略。这里有两种方式, 第一种是修改要使用缓存的实体的映射文件。如在User.hbm.xml中使用标签启用。 ,使用EhCache配置二级缓存,第二种方式是在hibernate.cfg.xml中使用 标签指定实体类并启用。 true org.hibernate.cache.EhCacheProvider ,使用EhCache配置二级缓存,/

11、Customer使用读写二级缓存 ,/执行下面一条时,Hibernate将产生一条SQL Customer cus = (Customer)session.get(Customer.class, 1l); /关闭Session的一级缓存清空,但二级缓存中仍保留有cus的数据 session.close(); /打开session再次获取Customer时,检查控制台并未产生一条SQL /Hibernate此时并未从数据库中获取数据而是从二级缓存中获取。 Customer cus = (Customer)session.get(Customer.class, 1l);,二级缓存示例,首先,不是所

12、有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来? 下面这几种情况就不适合加载到二级缓存中: 1.经常被修改的数据 2.绝对不允许出现并发访问的数据 3.与其他应用共享的数据 下面这几种情况适合加载到二级缓存中: 1.数据更新频率低 2.允许偶尔出现并发问题的非重要数据 3.不会被并发访问的数据 4.常量数据 5.不会被第三方修改的数据,二级缓存的适用范围,Hibernate的二级缓存策略是针对ID查询的策略,和对象ID密切相关,那么对于条件查询就不适用了。因此,Hibernate引入了“查询缓存”。 启用查询缓存后,第一次执行查询时,

13、Hibernate会把查询结果放入二级缓存中;以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能。 查询缓存依赖二级缓存(查询实体对象结果集依赖,查询普通属性结果集不依赖)。,查询缓存概述,修改hibernate.cfg.xml文件开启查询缓存。 true org.hibernate.cache.EHCacheProvider true true 在程序中必须手动启用查询缓存,如: query.setCacheable(true);,查询缓存的配置和使用,查询普通属性结果集测试 查询实体对象结果集测试 Hibernate 查询缓存true 与 二级缓存 fasle查询实体对象

14、结果集测试 Hibernate 查询缓存true 与 二级缓存 true查询实体对象结果集测试,编写以下程序测试查询缓存,查询缓存是针对普通属性结果集的缓存个人推荐用这个,单独用查询缓存。 对实体对象的结果集只缓存ID ,这配合Hibernate二级缓存一起用。 在查询普通属性结果集时查询缓存只对query.list()起作用,query.iterate()不起作用。 在查询实体对象结果集时查询缓存对query.list()和query.iterate()都起作用。 推荐无论查询普通属性结果集还是查询实体对象结果集,都要开启二级缓存和查询缓存,而且要使用query.list()方法查询。,查询

15、缓存特点总结,查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束。 查询缓存适用于以下场合: 在应用程序运行时经常使用的查询语句。 用来查询那些不经常变更的数据,如数据字典。,查询缓存生命周期和适用场合,瞬时状态(transient):刚刚用new语句建立,还没有被持久化,不处于session的缓存中。 持久化对象(persistent):已经被持久化,加入到session的缓存中。 游离状态(detached):已经被持久化,但不再处于session的缓存中。,对象的状态,对象状态的转换,Session session = sf.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer cus = new Customer();/瞬时状态 cus.setName(Tony); session.save(cus);/持久化状态 mit(); session.close(); /修改游离态的Customer对象 cus.setName(ModTonyName);

温馨提示

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

评论

0/150

提交评论