Hibernate 缓存

一级缓存是Session级别的缓存,Hiberante来管理的,这个一般不用管,

二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载

 

一级缓存的管理

当应用程序调用Sessionsave()update()savaeOrUpdate()get()load(),以及调用查询接口的list()iterate() 方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):从缓存中清除参数指定的持久化对象。

clear():清空缓存中所有持久化对象。

 

二级缓存的管理

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

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

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

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

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

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

1 很少被修改的数据

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

3 不会被并发访问的数据

4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

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

1 经常被修改的数据

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

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

 

使用ehcache配置二级缓存

步骤:

1) ehcache-1.2.3.jar加入到当前应用的classpath中。

2) hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。

<!—开启缓存-->

   <property name="hibernate.cache.use_query_cache">true</property>

<!--配置缓存插件 -->

    <property name="hibernate.cache.provider_class">  

    org.hibernate.cache.EhCacheProvider

    </property>   

3) 拷贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc

 

 

 

 

 

 

 

 

在需要缓存的实体bean配置文件中加入缓存配置项

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package=“com.tfsoftware.hibernate.model.Dept">

 

    <class name=“Dept" table=“dept">

 <!— 配置缓存,必须紧跟在class元素后面对缓存中的Dept对象采用读写型的并发访问策略 -->

                <cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>

 

  <id column="deptID" name="deptID" type="integer">

<generator />

</id>

<property column="deptName" length="50" name="deptName"

not-null="true" type="string" />

 

<set name="employees" cascade="save-update" inverse="true">

<!-- Hibernate只会缓存对象的简单属性的值,

       要缓存集合属性,必须在集合元素中也加入<cache>子元素

       Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。

如果希望把整个关联的对象的所有数据都存入缓存,

则要在相应关联的对象的映射文件中配置<cache>元素 -->

  <cache usage="read-write"/>

<key>

<column name="deptID" not-null="true"/>

</key>

<one-to-many

class="com.tfsoftware.hibernate.model.Employee" />

</set>

</class>

</hibernate-mapping>

   说明:usage说明了缓存的策略,region指定缓存的区域名

 

Ehcache默认的配置文件ehcache.xml(放在类路径下)

<ehcache>

    <diskStore path="D:\cache"/>

    <defaultCache  maxElementsInMemory="1000“  eternal="false“ overflowToDisk="true"

        timeToIdleSeconds="120"

        timeToLiveSeconds="180"

        diskPersistent="false"

        diskExpiryThreadIntervalSeconds="60"/>

<!-- 设置Dept类的employee集合的缓存的数据过期策略 -->

<cache name=" com.tfsoftware.hibernate.model.Dept.employees"

maxElementsInMemory="100"

    eternal="false"

    overflowToDisk="true"

    timeToIdleSeconds="300"

    timeToLiveSeconds="600"

    diskPersistent="false"/>

</ehcache>

 

Ehcache默认的配置文件ehcache.xml

说明:

    defaultCache节点为缺省的缓存策略

     maxElementsInMemory 内存中最大允许存在的对象数量

     eternal 设置缓存中的对象是否永远不过期

     overflowToDisk 把溢出的对象存放到硬盘上

     timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉

     timeToLiveSeconds 指定缓存对象总的存活时间

     diskPersistent jvm结束是否持久化对象

     diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间

 

二级缓存:

    1>准备工作:
    (1)需要copy commons-logging-1.0.4 jar包到lib目录中

2>在cfg文件中配置:
    <!—开启缓存-->
   
    <property name="hibernate.cache.use_query_cache">true</property>
    
<!--配置缓存插件 -->
    
    <property name="hibernate.cache.provider_class">
        org.hibernate.cache.EhCacheProvider
 
    </property>
3>需要在hbm文件中配置:(谁需要放入二级缓存就在谁的映射中写以下配置,如果是主从表关系那么主表中的set想要有从表数据的话必须在从表映射中也要加以下配置)
     <!— 配置缓存,必须紧跟在class元素后面,?对缓存中的Dept对象采用读写型的并发访问策略?-->
                
    <cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>
4>需要把E:\course\jsp\Hibernate\hibernate-distribution-3.3.2.GA\project\etc目录下的ehcache.xml文件copy到src目录里
    <ehcache>        
    <diskStore path="D:\cache"/>        
    <defaultCache  
            maxElementsInMemory="1000“  eternal="false“ overflowToDisk="true"                               
            timeToIdleSeconds="120"
      
            timeToLiveSeconds="180"
        
        diskPersistent="false"
        
        diskExpiryThreadIntervalSeconds="60"/>
    <!-- 设置Dept类的employee集合的缓存的数据过期策略 -->
    
<cache name=" com.tfsoftware.hibernate.model.Dept.employees" maxElementsInMemory="100"
                
            eternal="false"
            overflowToDisk="true"
    
            timeToIdleSeconds="300"
    
            timeToLiveSeconds="600"
    
            diskPersistent="false"/>
    
</ehcache>    
    defaultCache节点为缺省的缓存策略
     
    maxElementsInMemory 内存中最大允许存在的对象数量
     
    eternal 设置缓存中的对象是否永远不过期
     
    overflowToDisk 把溢出的对象存放到硬盘上
     
    timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
     
    timeToLiveSeconds 指定缓存对象总的存活时间
     
    diskPersistent 当jvm结束是否持久化对象
     
    diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间


转载于:https://my.oschina.net/u/2353689/blog/476087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值