Hibernate缓存机制

来源:互联网 发布:阿里云域名过户怎么过 编辑:程序博客网 时间:2024/05/22 02:06

一、缓存范围分类

1、事务范围缓存:
事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式,缓存的生命周期依赖于事务的生命周期,事务结束缓存生命周期也结束。Hibernate一级缓存属于该类型缓存。

2、应用范围缓存:
应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束。Hibernate二级缓存属于该类型缓存。

3、集群范围缓存:
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致。


二、缓存的并发访问策略

*当多个并发的事务同时访问缓存中的相同数据时,会引发起并发问题,必须采用必要的措施避免事务并发访问引起的问题。
*在应用范围或集群范围的缓存,会出现并发问题,因此可以设定以下四种类型的并发访问策略,避免引起并发问题。



三、Hibernate提供了两级缓存:

*第一级别的缓存是Session级别的缓存

当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当刷新缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。当关闭Session时,一级缓存生命周期随之结束。

void clear()方法  清空一级缓存
void flush()方法  强制刷新一级缓存
void evict()方法  将某一个实体从缓存中清除

*第二级别的缓存是SessionFactory级别的缓存,Hibernate数据库查询结果依赖于二级缓存。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此二级缓存是应用范围缓存。

适合存放到二级缓存中的数据有以下四种:
很少被修改的数据
不是很重要的数据,允许偶尔并发的数据
不会被并发访问的数据
参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用。它的实例极少或从来不会被修改。
对于那些常被修改的数据,如财务数据和其他应用共享的数据,这些都不能放到第二级缓存中

常见的缓存插件有:
EhCache:可作为进程访问的缓存,存放的物理介质可以是内存或硬盘
OSCache:可作为进程范围的缓存,存放数据的物理介质可以使内存或硬盘,体统丰富的缓存数据过期策略
SwarmCache:可作为集群范围内的缓存,但不支持hibernate查询缓存
TreeCache:可作为集群范围内的缓存,支持事务性并发访问策略


四、使用EhCache插件为Hibernate提供二级缓存

步骤:1、引入必需的jar包 

2、在Hibernate配置文件中配置

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

3、在src下配置ehcache.xml文件

 <cache name="com.zhidisoft.entity.Dept"      //指定需要 使用缓存的实体类

maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />

4、 配置实体类的并发访问策略

 <class name="com.zhidisoft.entity.Dept" table="DEPT">
    <cache usage="read-only"/>
  //并发访问策略



原创粉丝点击