Hibernate的缓存机制

      Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存有Hibernate自身管理,通常状况下不须要进行干预;第二级别的缓存是SessionFactory的缓存,它是属于进程范围或集群范围的缓存。这一级别的缓存能够进行配置和更改而且能够动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级别的缓存。java

   Hibernate提供的一级缓存数据库

hibernate是一个线程对应一个session,一个线程能够当作一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。缓存

hibernate一级缓存生命周期很短,和session生命周期同样,一级缓存也称session级的缓存或事务级缓存。若是tb事务提交或回滚了,咱们称session就关闭了,生命周期结束了。session

一级缓存的管理: 
  evit(Object obj)  将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象. 
  clear()  将一级缓存中的全部持久化对象清除,释放其占用的内存资源 
  contains(Object obj) 判断指定的对象是否存在于一级缓存中. 
  flush() 刷新一级缓存区的内容,使之与数据库数据保持同步. 
并发

 二级缓存的管理:    
   evict(Class arg0, Serializable arg1)  将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源. 
app

Java代码  收藏代码ide

  1. sessionFactory.evict(Customer.classnew Integer(1));  spa

   evict(Class arg0)  将指定类的全部持久化对象从二级缓存中清除,释放其占用的内存资源. 
.net

Java代码  收藏代码hibernate

  1. sessionFactory.evict(Customer.class);  


   evictCollection(String arg0)  将指定类的全部持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源. 

Java代码  收藏代码

  1. sessionFactory.evictCollection("Customer.orders");  

Hibernate的二级缓存的配置 
二级缓存须要sessionFactory来管理,它是进初级的缓存,全部人均可以使用,它是共享的。

 首先,不是全部的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来? 
  下面这几种状况就不适合加载到二级缓存中: 
  1.常常被修改的数据 
  2.绝对不容许出现并发访问的数据 
  3.与其余应用共享的数据 
  下面这己种状况合适加载到二级缓存中: 
  1.数据更新频率低 
  2.容许偶尔出现并发问题的非重要数据 
  3.不会被并发访问的数据 
  4.常量数据 
  5.不会被第三方修改的数据 
Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器 . 
经常使用的二级缓存插件 
EHCache  org.hibernate.cache.EhCacheProvider 
OSCache  org.hibernate.cache.OSCacheProvider 
SwarmCahe  org.hibernate.cache.SwarmCacheProvider 
JBossCache  org.hibernate.cache.TreeCacheProvider 
简单介绍一下EHCache的配置 
hibernate.cfg.xml 

Xml代码  收藏代码

  1. <hibernate-configuration>  

  2.    <session-factory>  

  3.       <!-- 设置二级缓存插件EHCache的Provider类-->  

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

  5.          org.hibernate.cache.EhCacheProvider  

  6.       </property>  

  7.       <!-- 启动"查询缓存" -->  

  8.       <property name="hibernate.cache.use_query_cache">  

  9.          true  

  10.       </property>  

  11.    </session-factory>  

  12.  </hibernate-configuration>  


ehcache.xml 

Xml代码  收藏代码

  1. <ehcache>  

  2.   <!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过时,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->  

  3.   <diskStore path="java.io.tmpdir"/>  

  4.     <defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>  

  5. </ehcache>  



****.hbm.xml 

Xml代码  收藏代码

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

  2. <!DOCTYPE hibernate-mapping PUBLIC  

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

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

  5. <hibernate-mapping>  

  6.    <class>  

  7.        <!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-->  

  8.        <cache usage="read-write"/>      

  9.    </class>  

  10. </hibernate-mapping>  

相关文章
相关标签/搜索