Hibernate的缓存机制.doc

上传人:大米 文档编号:558269454 上传时间:2023-10-01 格式:DOC 页数:8 大小:57KB
返回 下载 相关 举报
Hibernate的缓存机制.doc_第1页
第1页 / 共8页
Hibernate的缓存机制.doc_第2页
第2页 / 共8页
Hibernate的缓存机制.doc_第3页
第3页 / 共8页
Hibernate的缓存机制.doc_第4页
第4页 / 共8页
Hibernate的缓存机制.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Hibernate的缓存机制.doc》由会员分享,可在线阅读,更多相关《Hibernate的缓存机制.doc(8页珍藏版)》请在金锄头文库上搜索。

1、Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事务级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现Hibernate缓存概述 缓存是介于物理数据源与应用程序之间,是数据库数据在内存中的存放临时copy的容器,其作用是为了减少应用程序对物理数据源(如硬盘)访问的次数,从而提高了应用的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称作“缓存命中

2、),则就直接把命中的数据作为结果加以利用,避免了建立数据库查询的性能损耗。Hibernate缓存分类 一级缓存(session):内部缓存事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。二级缓存(sessionFactory):缓存被应用范围内的所有事务共享这些事务有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时,缓存也就结束了生命周期,二级缓存存在于应用范围。集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓

3、存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式,二级缓存也存在与应用范围。注意:对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,再加上集群范围还有数据同步的问题,所以应当慎用。多种范围的缓存处理过程持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到应用范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询了。 缓存应用的范围:修改少,数量在可以接受的范围内使用二级缓存的原则:数据不会被第三方修改 同一数据系统经常引用 数据大小在可接受范围之内 关键数据或不会被并发更新的数据hibernate引入第三方的缓存组件EHCACHE

4、,下面是具体的实现步骤:修改hibernate.cfg.xml配置引入ehCache缓存1. 2. 3. 4. 5. 6. 7. net.sf.ehcache.hibernate.EhCacheProvider 8. 9. /property10. 11. 12. 13. true/property14. 15. /session-factory16. 17. /hibernate-configuration18. 在src根目录下加入ehcache.xml文件,具体内容如下:19. 20. 21. 34. 35. /ehcache36. 在映射文件中指定缓存同步策略37. 38. 39. 4

5、0. 41. 42. 43. 44. 45. /set46. 47. /class48. usage属性说明:read-only:只读。对于不会发生改变的数据,可使用只读型缓存。 nonstrict-read-write:不严格可读写缓存。如果应用程序对并发访问下的数据同步要求不是很严格的话,而且数据更新操作频率较低。采用本项,可获得良好的性能。 read-write 对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题. transactional(事物型)在Hibernate中,事务型缓存必须运行在JTA事务环境中。在测试query时,说明其将用二级缓存49

6、. query.setCacheable(true);3、释放缓存:一级缓存的释放 Session.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续运用此对象的状态变化来同步更新数据库。Session.clear()清除所有的一级缓存二级缓存的释放SessionFacatoyr.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续

7、运用此对象的状态变化来同步更新数据库。SessionFactory.clear()清除所有的二级缓存4、查询缓存:二级缓存策略的一般过程: Hibernate进行条件查询的时候,总是发出一条select * from XXX where (XXX为 表名,类似的语句下文统称Select SQL)这样的SQL语句查询数据库,一次获得所有的符合条件的数据对象。把获得的所有数据对象根据ID放入到第二级缓存中。当Hibernate根据ID访问数据对象的时候,首先从内部缓存中查找,如果在内部缓存中查不到就配置二级缓存,从二级缓存中查;如果还查不到,再查询数据库,把结果按照ID放入到缓存。添加数据、删除、

8、更新操作时,同时更新二级缓存。这就是Hibernate做批处理的时候效率不高的原因,原来是要维护二级缓存消耗大量时间的缘故。 条件查询的处理过程:第一次查找age20的所有学生信息,然后纳入二级缓存。第二次我们的查询条件变了,查找age15的所有学生信息,显然第一次查询的结果完全满足第二次查询的条件,但并不是满足条件的全部数据。这样的话,我们就要再做一次查询得到全部数据才行。如果我们执行的是相同的条件语句,Hibernate引入Query Cache的。 查询缓存策略的一般过程: 完全相同的Select SQL重复执行。重复执行期间,Query Key对应的数据表不能有数据变动(比如添、删、改

9、操作) 启用Query Cache,我们需要在hibernate.cfg.xml中进行配置,参考配置如下(只列出核心配置项): 50. 51. 52. 53. 54. true/property55. 56. /session-factory57. 58. /hibernate-configuration59. 在查询执行之前,将Query.Cacheable设置为true,而且每次都应该这样。比如:60. Queryquery=session.createQuery(hql).setInteger(0.15); 61. 62. query.setCacheable(true); 63. lo

10、ad、get的使用本文主要介绍Hibernate中两个极为相似的方法Hibernate get()与Hibernate load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于:如果找不到符合条件的纪录,get()方法将返回null而load()将会报出ObjectNotFoundEcceptionload()方法可以返回实体的代理类实例,而get()永远只返回实体类load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用完成查找,没有说到根本点上,Hibernate get方法和Hibernate load方法的根本区别在于:如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号