`
javaeyetodj
  • 浏览: 425095 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

对Hibernate一级缓存与二级缓存的解析

阅读更多
转自http://developer.51cto.com/art/200909/153359.htm
--- blogjava 

本文主要介绍Hibernate缓存,以及Hibernate缓存的分类,下面一一为读者简单分析,希望大家看后有很大的收获。

1、Hibernate缓存概述

缓存是介于物理数据源与应用程序之间,是数据库数据在内存中的存放临时copy的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命中"),则就直接把命中的数据作为结果加以利用,避免了建立数据库查询的性能损耗。

2:Hibernate缓存分类

一级缓存(session):内部缓存

事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。

二级缓存(sessionFactory):缓存被应用范围内的所有事务共享。 这些事务有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时, 缓存也就结束了生命周期,二级缓存存在于应用范围。集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性, 缓存中的数据通常采用对象的松散数据形式,二级缓存也存在与应用范围。

注意:对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,再加上集群范围还有数据同步的问题,所以应当慎用。多种范围的缓存处理过程持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到应用范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询了。

缓存应用的范围:修改少,数量在可以接受的范围内

使用二级缓存的原则:

◆数据不会被第三方修改

◆同一数据系统经常引用

◆数据大小在可接受范围之内

◆关键数据或不会被并发更新的数据

hibernate引入第三方的缓存组件EHCACHE,下面是具体的实现步骤:

修改hibernate.cfg.xml配置引入ehCache缓存

<hibernate-configuration>                          <session-factory>                                  <property name="hibernate.cache.provider_class">                                          net.sf.ehcache.hibernate.EhCacheProvider                                   property>                                                                    <property name="hibernate.cache.use_query_cache">trueproperty>                          session-factory>                  hibernate-configuration>  在src根目录下加入ehcache.xml文件,具体内容如下:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">                  <defaultCache                              maxElementsInMemory="10000"                              eternal="false"                              timeToIdleSeconds="120"                              timeToLiveSeconds="120"                              overflowToDisk="true"                              />                  ehcache>  在映射文件中指定缓存同步策略

<class name="com.tenly.bean.Student">                          <cache usage="read-write">                          <set name="classroom">                                  <cache usage="read-only">                          set>                  class>  usage属性说明:

◆read-only:只读。对于不会发生改变的数据,可使用只读型缓存。

◆nonstrict-read-write:不严格可读写缓存。如果应用程序对并发访问下的数据同步要求不是很严格的话,而且数据更新操作频率较低。采用本项,可获得良好的性能。

◆read-write 对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题.

◆transactional(事物型)在Hibernate中,事务型缓存必须运行在JTA事务环境中。在测试query时,说明其将用二级缓存

query.setCacheable(true); 3、释放缓存:

一级缓存的释放

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

二级缓存的释放

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

4、查询缓存:

二级缓存策略的一般过程:

Hibernate进行条件查询的时候,总是发出一条select * from XXX where …(XXX为 表名,类似的语句下文统称Select SQL)这样的SQL语句查询数据库,一次获得所有的符合条件的数据对象。把获得的所有数据对象根据ID放入到第二级缓存中。当Hibernate根据ID访问数据对象的时候,首先从内部缓存中查找,如果在内部缓存中查不到就配置二级缓存,从二级缓存中查;如果还查不到,再查询数据库,把结果按照ID放入到缓存。添加数据、删除、更新操作时,同时更新二级缓存。这就是Hibernate做批处理的时候效率不高的原因,原来是要维护二级缓存消耗大量时间的缘故。

条件查询的处理过程:

第一次查找age>20的所有学生信息,然后纳入二级缓存。第二次我们的查询条件变了,查找age>15的所有学生信息,显然第一次查询的结果完全满足第二次查询的条件,但并不是满足条件的全部数据。这样的话,我们就要再做一次查询得到全部数据才行。如果我们执行的是相同的条件语句,Hibernate引入Query Cache的。

查询缓存策略的一般过程:

完全相同的Select SQL重复执行。重复执行期间,Query Key对应的数据表不能有数据变动(比如添、删、改操作)

启用Query Cache,我们需要在hibernate.cfg.xml中进行配置,参考配置如下(只列出核心配置项):

<hibernate-configuration>                                          <session-factory>                                                  <property name="hibernate.cache.user_query_cache">trueproperty>                                          session-factory>                                  hibernate-configuration>  在查询执行之前,将Query.Cacheable设置为true,而且每次都应该这样。比如:

Query query=session.createQuery(hql).setInteger(0.15);                                   query.setCacheable(true);   【编辑推荐】

分享到:
评论

相关推荐

    Hibernate4二级缓存实例(源码)

    用memcached实现 Hibernate4二级缓存的实例源码。

    hibernate二级缓存

    整合网络上对hibernate缓存的资料,清晰的解析hibernate是如何使用二级缓存

    Hibernate缓存机制实例代码解析

    主要介绍了Hibernate缓存机制实例代码解析,介绍了查询缓存,一级二级缓存等内容,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    hibernate操作数据库笔记

    //该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL)...

    hibernate注解

    hibernate注解 1.级联关系 2.增删改查 3.二级缓存 4.日志配置 5.注解解析

    Hibernate入门文档

    Hibernate 难点解析: hibernate中uuid和native的相关总结 ...hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别

    基于hibernate 通用查询框架,包含查询、分页列表 功能

    2.支持二级缓存(近期完成) 3.关联属性列表展现(近期完成) 4.动态列表生成功能,用户通过界面自行配置想要输出的列表(构思中) 5.动态统计,用户通过界面自行配置想要的统计(构思中) Awake 在Ajax应用上存在...

    ehcache全解析

    ehcache全解析 利用Spring和EHCache缓存结果 Hibernate+ehcache二级缓存技术 Spring基于注解的缓存配置--web应用实例 http://zjava.org.ru/

    learning-notes:学习一些东西

    哨兵模式和Redis-Cluster集群)2.Redis内存回收机制3.Redis笔记4.Redis Cluster原理5.Redis锁6.Redis分库分表分库分表网络1.https原理2.TCP与UDPMyBatis一级与二级缓存hibernate一级与二级缓存Spring1.循环依赖MySQL...

    Java Web程序设计教程

    10.2.3应用二级缓存 214 10.2.4应用第三方缓存 216 10.3项目实战——借还图书 217 本章小结 224 课后练习 224 第11章spring框架基础 226 11.1spring框架概述 226 11.1.1认识spring框架 226 11.1.2spring框架...

    web开发常用jar

    Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 hibernate3.jar hibernate3的核心类库。 itext.jar 是用于生成PDF文档的一个...

    Awake 1.0.1 个人版,增添页面排序、xml数据解析器 等功能

    xml数据解析器:通过xml...2.支持二级缓存(近期完成) 3.关联属性列表展现(近期完成) 4.动态列表生成功能,用户通过界面自行配置想要输出的列表(构思中) 5.动态统计,用户通过界面自行配置想要的统计(构思中)

    Spring面试题

    7. 表字段要少,表关联不要怕多,有二级缓存撑腰 7. Struts工作机制?为什么要使用Struts? 工作机制: Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中...

    java开发常用jar包

    Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 hibernate3.jar hibernate3的核心类库。 itext.jar 是用于生成PDF文档的一个java...

    java开源包1

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包11

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包2

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包3

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包6

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包5

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

Global site tag (gtag.js) - Google Analytics