Hibernate緩存機制

緩存是位於應用程序與物理數據源之間,用於臨時存放複製數據的內存區域,目的是爲了減少應用程序對物理數據源訪問的次數,從而提高應用程序的運行性能.
  Hibernate
在查詢數據時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數據源中檢索,所以,把頻繁使用的數據加載到緩存區後,就可以大大減少應用程序對物理數據源的訪問,使得程序的運行性能明顯的提升.
 
Hibernate緩存分類:


Session
緩存,一級緩存.

SessionFactory的緩存分爲內置緩存和外置緩存.內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定義SQL語句等),對於應用程序來說,它是隻讀的.外置緩存中存放的是數據庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作爲存儲介質外,還可以選用硬盤等外部存儲設備
.

Hibernate的緩存範圍


Hibernate的一級緩存和二級緩存都位於均位於持久層,且均用於存放數據庫數據的副本,最大的區別就是緩存的範圍各不一樣
.

緩存的範圍分爲3類
:

1.事務範圍

   事務範圍的緩存只能被當前事務訪問,每個事務都有各自的緩存,緩存內的數據通常採用相互關聯的對象形式.緩存的生命週期依賴於事務的生命週期,只有當事務結束時,緩存的生命週期纔會結束.事務範圍的緩存使用內存作爲存儲介質,一級緩存就屬於事務範圍
.
2.應用範圍

   應用程序的緩存可以被應用範圍內的所有事務共享訪問.緩存的生命週期依賴於應用的生命週期,只有當應用結束時,緩存的生命週期纔會結束.應用範圍的緩存可以使用內存或硬盤作爲存儲介質,二級緩存就屬於應用範圍
.
3.集羣範圍

   在集羣環境中,緩存被一個機器或多個機器的進程共享,緩存中的數據被複制到集羣環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致,緩存中的數據通常採用對象的鬆散數據形式
.

  Hibernate的緩存管理


一級緩存的管理:


  evit(Object obj)  將指定的持久化對象從一級緩存中清除,釋放對象所佔用的內存資源,指定對象從持久化狀態變爲脫管狀態,從而成爲遊離對象
.
  clear()  將一級緩存中的所有持久化對象清除,釋放其佔用的內存資源

  contains(Object obj) 判斷指定的對象是否存在於一級緩存中
.
  flush() 刷新一級緩存區的內容,使之與數據庫數據保持同步
.

  二級緩存的管理:

  
   evict(Class arg0, Serializable arg1)  將某個類的指定ID的持久化對象從二級緩存中清除,釋放對象所佔用的資源
.
  

Java代碼  

  1. sessionFactory.evict(Customer.class, new Integer(1));  

sessionFactory.evict(Customer.class, new Integer(1));


   evict(Class arg0)  將指定類的所有持久化對象從二級緩存中清除,釋放其佔用的內存資源.
  

Java代碼  

  1. sessionFactory.evict(Customer.class);  

sessionFactory.evict(Customer.class);


   evictCollection(String arg0)  將指定類的所有持久化對象的指定集合從二級緩存中清除,釋放其佔用的內存資源.
  

Java代碼  

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

sessionFactory.evictCollection("Customer.orders");



Hibernate的二級緩存的配置

首先,不是所有的數據都適合放在二級緩存中,看一下,什麼樣的數據適合放在二級緩存中來?什麼樣的數據不適合放在二級緩存中來?
  下面這幾種情況就不適合加載到二級緩存中
:
  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>  

 <hibernate-configuration>

    <session-factory>

       <!-- 設置二級緩存插件EHCache的Provider類-->

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

          org.hibernate.cache.EhCacheProvider

       </property>

       <!-- 啓動"查詢緩存" -->

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

          true

       </property>

    </session-factory>

  </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>  

<ehcache>

  <!-- maxElementsInMemory爲緩存對象的最大數目, eternal設置是否永遠不過期,timeToIdleSeconds對象處於空閒狀態的最多秒數,timeToLiveSeconds對象處於緩存狀態的最多秒數 -->

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

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

</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.   
  6. <hibernate-mapping>  
  7.         
  8.    <class>  
  9.        <!-- 設置該持久化類的二級緩存併發訪問策略 read-only read-write nonstrict-read-write transactional-->  
  10.        <cache usage="read-write"/>       
  11.    </class>  
  12.   
  13. </hibernate-mapping>  

<?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>

    

   <class>

       <!-- 設置該持久化類的二級緩存併發訪問策略 read-only read-write nonstrict-read-write transactional-->

       <cache usage="read-write"/>   

   </class>

 

</hibernate-mapping>

 

發佈了3 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章