`

ch04 hibernate二级缓存配置

 
阅读更多
2:hibernate二级缓存配置

2_1、首先导包ehcache-1.2.3.jar,放在WEB-INF/lib中。

2_2、设置ehcache.xml,默认的位置在class-path,可以放在你的src目录下:
<ehcache>
<!-- 
    <diskStore path="java.io.tmpdir"/>  
    -->
    <diskStore path="e:\\cache"/>
    <defaultCache
            maxElementsInMemory="10000"<!-- 缓存最大数目 -->
            eternal="false"<!-- 缓存是否持久 -->
            timeToIdleSeconds="60"<!-- 当缓存闲置n秒后销毁 -->
            timeToLiveSeconds="60"<!-- 当缓存存活n秒后销毁-->
            overflowToDisk="true"<!-- 是否保存到磁盘,当系统当机时-->
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"           
            />
</ehcache>

2_3、在hibernate.cfg.xml中添加如下代码:
<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->		
<property name="hibernate.cache.provider_class">
			org.hibernate.cache.EhCacheProvider
		</property>
<!-- 是否使用查询缓存 –
说明:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行.
-->		
<property name="hibernate.cache.use_query_cache">true</property>

2_4、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象, 在实体对象的映射文件中(相应的<class>标签内部),添加如下配置:    
<cache usage="read-only"/>      
usage="read-only"是“只读”缓存策略。      
注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!这个<cache>标签放在哪些<class>标签下面,就说明会多这些类的对象进行缓存
对于第4步,有一个可选的方案在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,而不需要使用<cache>标签来指定。如在hibernate.cfg.xml中添加如下配置:
<class-cache class="com.andy.pojo.Users" usage="read-only"/>
注意,这个<class-cache>标签必须放在<mapping>标签的后面!!

备注
-- Hibernate的缓存机制介绍
 
 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。 

  缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现
不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。

  Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。
Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,
前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了
映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,
SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与
映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库
数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

-------------------------------------------------------------------------------------------------------------------

  Hibernate的这两级缓存都位于持久化层,存放的都是数据库数据的拷贝,那么它们之间的区别是什么呢?为了理解二者的区别,
需要深入理解持久化层的缓存的两个特性:缓存的范围和缓存的并发访问策略。

++++持久化层的缓存的范围

  缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。

  1 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,
      缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。

  2 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期
      依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或
      硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但
      是对象分解为松散的算法比对象序列化的算法要求更快。

  3 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过
      远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。

  对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,因为访问的速度不一定会比直接访问数据库数据的速度快多少。

  持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到进程范围或集群范围的缓存内查询,如果还是
    没有查到,那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存,通常它是必需的;进程范围或集群范围的缓存是持久化层
    的第二级缓存,通常是可选的。

++++持久化层的缓存的并发访问策略

  当多个并发的事务同时访问持久化层的缓存的相同数据时,会引起并发问题,必须采用必要的事务隔离措施。

  在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。因此可以设定以下四种类型的并发访问策略,每一种策略对应一种事务
    隔离级别。

  事务型:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,
            因为它可以防止脏读和不可重复读这类的并发问题。

  读写型:提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,
            因为它可以防止脏读这类的并发问题。

  非严格读写型:不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能,必须为该数据配置一个很短的
                  数据过期时间,从而尽量避免脏读。对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。 
  
    只读型:对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。

  事务型并发访问策略是事务隔离级别最高,只读型的隔离级别最低。事务隔离级别越高,并发性能就越低。

-------------------------------------------------------------------------------------------------------------------

    什么样的数据适合存放到第二级缓存中?

  1、很少被修改的数据 

  2、不是很重要的数据,允许出现偶尔并发的数据

  3、不会被并发访问的数据

  4、参考数据

------------------------------------------------------------

  不适合存放到第二级缓存的数据?

  1、经常被修改的数据

  2、财务数据,绝对不允许出现并发

  3、与其他应用共享的数据。

-------------------------------------------------------------------------------------------------------------------

Hibernate的二级缓存

  如前所述,Hibernate提供了两级缓存,第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个
    应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的
    每个实例都具有唯一的OID。

  第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个
    过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,
    因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。
    第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。

-------------------------------------------------------------------------------------------------------------------

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

  1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,
       一次获得所有的数据对象。 

  2) 把获得的所有数据对象根据ID放入到第二级缓存中。 

  3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;
       查不到,再查询数据库,把结果按照ID放入到缓存。 

  4) 删除、更新、增加数据的时候,同时更新缓存。

--------------------------------------------------------------------------------------------------------------------

  Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query缓存。

  Hibernate的Query缓存策略的过程如下: 

  1) Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,
       记录范围(起始位置rowStart,最大记录个数maxRows),等。 

  2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,
       获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。 

  3) Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。

分享到:
评论

相关推荐

    精通hibernate源码ch3

    5. 第二级缓存:除了默认的一级缓存外,Chapter 3可能涉及启用和配置第二级缓存,提高应用性能。 6. 查询:详细讲解HQL和Criteria API的用法,包括条件查询、分页、排序等。 四、源码分析 深入理解Hibernate源码...

    精通hibernate源码ch2

    - 第二级缓存:可选的,跨Session共享,可以是第三方缓存服务如Ehcache。 - 查询缓存:存储查询结果,提高查询性能。 6. Hibernate源码解析: - SessionImpl:实际的Session实现,包含对数据库的CRUD操作。 - ...

    精通hibernate源码ch5

    二级缓存则是可选的,它可以跨多个Session共享数据,通常由缓存提供商如Ehcache提供。Chapter5会详细讲解这两级缓存的工作原理及配置方法。 五、事务处理 在对象持久化过程中,事务管理是至关重要的。Hibernate...

    精通hibernate源码ch4

    第一级缓存默认开启,而第二级缓存可配置,通过缓存插件如Ehcache实现。 七、实体关系映射(JPA) Hibernate遵循Java Persistence API(JPA)标准,提供了丰富的映射机制,包括一对一、一对多、多对一、多对多等...

    hibernate2ch_reference.pdf

    Hibernate内置了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。二级缓存可通过插件如Ehcache实现,能提高数据访问效率,但也需注意缓存一致性问题。 11. **多对一、一对多、多对多...

    精通hibernate源码ch7

    6. **第二级缓存**:除了Session级别的第一级缓存,Hibernate还支持可配置的二级缓存。它可以跨Session共享,提高数据访问效率,但需要考虑并发和数据一致性问题。 7. **事件和监听器**:Hibernate允许在特定操作...

    hibernate_reference.pdf

    - **二级缓存**:可选地添加外部缓存插件(如 Ehcache)来提高性能。 - **懒加载**:默认情况下,Hibernate 使用懒加载策略来延迟加载实体的关联对象,从而减少不必要的数据库访问。 #### 九、高级特性 - **实体...

    精通hibernate源码ch1

    Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),以及查询缓存,提高数据访问速度,减少对数据库的依赖。 七、事务管理 Hibernate支持JTA和JDBC两种事务管理方式,可以...

    hibernate quickly

    - **缓存机制**:了解Hibernate的一级缓存和二级缓存,以及如何配置和利用它们来提高性能。 - **关联映射**:一对一、一对多、多对多等关联关系的处理,以及懒加载和立即加载的概念。 - **事务处理**:理解...

    精通hibernate源码ch6

    Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如EhCache、Infinispan等。缓存可以减少对数据库的访问,提高系统性能。 总结,本章详细讲解了...

    hibernate学习档案

    同时,它内置了第一级缓存和第二级缓存机制,用于优化数据访问速度。 10. 异常处理与最佳实践: 在使用Hibernate时,需了解其特有的异常体系,如HibernateException、ConstraintViolationException等。遵循最佳...

    spring hibernate struts2经典例子

    Hibernate还支持二级缓存和查询语言HQL,提高了应用程序性能。 Struts2作为MVC框架,主要负责视图和控制器的职责。它基于拦截器模型,允许开发者自定义行为以处理HTTP请求。Struts2与Spring整合后,可以方便地进行...

    JSP页面缓存cache技术–浏览器缓存介绍及实现方法

    (比如:hibernate,还分1级和2级缓存) 业务层也可以有缓存(但一般来说,这是一个过程域,不会设缓存)。 表现层/数据服务层(传统web的表现层)也可以设置缓存(jsp cache 就是这一层,实现在app server上的缓存...

    SSH2框架所需的全部jar包

    5. **二级缓存**:Hibernate支持缓存机制,提高数据访问效率,减少对数据库的直接访问。 这些jar包的集合是SSH2开发的基础,包含了所有三个框架的核心类库和其他必要的依赖,如数据库驱动、日志库等。在实际开发中...

    JAVA上百实例源码以及开源项目源代码

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

Global site tag (gtag.js) - Google Analytics