• 攻城狮在路上(壹) 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"/>
    
    <defaultCache
    maxElementsInMemory="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.EhCacheProvider
    hibernate.cache.use_query_cache=true

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

  • 相关阅读:
    rsyslog日志服务器搭建
    使用原生js实现对table中的某个单元格进行编辑并提交后台修改数据
    使用vuex管理的状态数据在刷新页面后数据丢失的问题
    brew install mongodb
    brew安装与启动redis
    zsh设置代理
    DNS Rebinding漏洞原理
    防数据泄露_MySQL库和数据安全
    PHP代码审计_用==与===的区别
    MySQL提权 通过UDF
  • 原文地址:https://www.cnblogs.com/tq03/p/3789563.html
Copyright © 2020-2023  润新知