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>  

相關文章
相關標籤/搜索