首页 > 代码库 > 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存。
一、缓存的基本原理
  1、持久化层的缓存的范围
    A、事务范围:缓存只被当前事务访问。
    B、进程范围:缓存被进程内的所有事务共享。需要采取必要的隔离机制。缓存介质可以使内存或硬盘。
    C、集群范围:缓存被同一个机器或多个机器上的多个进程共享。缓存中的数据被复制到集群环境中的每一个进程节点,进程之间通过远程通信来保证缓存中的数据一致性,缓存中的数据通常采用数据的散装数据形式。
  事务范围的缓存是持久化层的第一级缓存,通常是必需的;进程范围和集群范围的缓存是持久化层的第二级缓存,通常是可选的。
  2、持久化层的缓冲的并发访问策略
    第二级缓存可能会出现并发问题,因此提供了4种类型的并发访问策略。
    A、事务型(Transactional):仅在受管理环境中适用。
    B、读写型(Read-write):提供Read Committed事务隔离级别,仅在非集群的环境中使用。
    C、非严格读写型(Nonstrict-read-write):不保证缓存和数据库中数据的一致性。
    D、只读型(Read-only):对于从来不会修改的数据,可以采用此种方式。
  3、适合存放到第二级缓存中的数据
    A、很少被修改的数据。
    B、不是很重要的数据,允许出现偶尔的并发问题。
    C、不会被并发访问的数据。
    D、参考数据。

二、Hibernate的二级缓存结构

                                                               

三、管理Hibernate的第一级缓存
  Session.evict(Ojbect o):从缓存中清除参数指定的持久化对象。
  Session.clear():清空缓存中所有的持久化对象。
  多数情况下,不提倡使用。
四、管理Hibernate的第二级缓存
  Hibernate的第二级缓存时进程或集群范围内的缓存,缓存中存放的是对象的散装数据。第二级缓存是可配置的插件。
  1、Hibernate允许使用的缓存插件
    A、EHCache:可作为进程范围的缓存,存放数据的物理介质可以使内存或者硬盘,支持Hibernate的查询缓存。
    B、OpenSymphony OSCache:可作为进程范围的缓存,存放介质可以使内存或硬盘,支持Hibernate的查询缓存,提供了丰富的缓存数据过期策略。
    C、SwarmCache:可作为集群范围内的缓存,但是不支持Hibernate的查询缓存。
    D、JBossCache:可作为集群范围内的缓存,支持事务型并发访问策略,支持Hibernate的查询缓存。
    各个缓存插件支持的并发访问策略:

缓存插件只读型非严格读写型读写型事务型
EHCache支持支持支持
OSCache支持支持支持
SwarmCache支持支持
JBossCache支持支持


    为了集成上述缓存插件,Hibernate提供了一个CacheProvider接口,每种缓存插件对应有一个实现类。
  2、配置第二级缓存主要包含以下步骤
    A、选择需要使用第二级缓存的持久化类,设置它的第二级缓存的并发访问策略。既可以在映射文件中配置,也可以再hibernate.cfg.xml中配置。
    B、选择合适的缓存插件,每一种缓存插件都有自带的配置文件,需要手工编辑。例如EhCache的配置文件为ehcache.xml。
  3、配置进程范围的第二级缓存
  Hibernate允许在类和集合的粒度上设置第二级缓存,映射文件中<class>和<set>元素都有一个<cache>子元素,用于配置第二级缓存。

<cache   usage="transactionql|read-write|nonstrict-read-write|read-only"  region="RegionName"  include="all|non-lazy"/>

实例代码:

Customer.xml:

<hibernate-mapping ><class name="mypack.Customer" table="CUSTOMERS" >  <cache usage="read-write" />  <id name="id" type="long" column="ID">    <generator class="increment"/>  </id>  <property name="name" type="string" >    <column name="NAME" length="15" />  </property>  <property name="age" type="int" >    <column name="AGE" />  </property>  <set     name="orders"    inverse="true"    lazy="true"  >  <cache usage="read-write" />  <key column="CUSTOMER_ID" />    <one-to-many class="mypack.Order" />  </set></class></hibernate-mapping>

ehcache.xml:

<ehcache><diskStore path="C:\\temp"/><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/><cache name="mypack.Customer"maxElementsInMemory="1"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/><cache name="mypack.Customer.orders"maxElementsInMemory="1000"eternal="true"overflowToDisk="false"/><cache name="mypack.Order"maxElementsInMemory="10000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/><cache name="customerQueries"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/></ehcache>

hibernate.properties:

hibernate.cache.provider_class=org.hibernate.cache.EhCacheProviderhibernate.cache.use_query_cache=true

4、配置集群范围的第二级缓存
暂不了解。