hibernate二級緩存 Ehcache配置詳解

一、hibernate緩存簡介

一級緩存(session):內部緩存
事務範圍:緩存只能被當前事務訪問。緩存的生命週期依賴於事務的生命週期,當事務結束時,緩存也就結束生命週期
 
二級緩存(sessionFactory):
緩存被應用範圍內的所有事務共享。 這些事務有可能是併發訪問緩存,因此必須對緩存進行更新。緩存的生命週期依賴於應用的生命週期,應用結束時, 緩存也就結束了生命週期,二級緩存存在於應用範圍。集羣範圍:在集羣環境中,緩存被一個機器或者多個機器的進程共享。緩存中的數據被複制到集羣環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致性, 緩存中的數據通常採用對象的鬆散數據形式,二級緩存也存在與應用範圍。
 
注意:對大多數應用來說,應該慎重地考慮是否需要使用集羣範圍的緩存,再加上集羣範圍還有數據同步的問題,所以應當慎用。多種範圍的緩存處理過程持久化層可以提供多種範圍的緩存。如果在事務範圍的緩存中沒有查到相應的數據,還可以到應用範圍或集羣範圍的緩存內查詢,如果還是沒有查到,那麼只有到數據庫中查詢了。
 
使用二級緩存的原則:
◆數據不會被第三方修改
◆同一數據系統經常引用
◆數據大小在可接受範圍之內
◆關鍵數據或不會被併發更新的數據

 

二、EhCache簡介

EHCache 是一個非常輕量級的緩存實現,是一個純Java的進程內緩存框架,而且從1.2 之後就支持了集羣,是Hibernate中默認的CacheProvider。

具有快速、精幹等特點,Ehcache可以直接使用。

也可以和Hibernate對象/關係框架結合使用。可以將對象、數據、jsp、Servlet進行緩存。

Cache 存儲方式 :內存或磁盤。

 

三、配置

1、首先到官網下載ehcache-core.jar、ehcache-web.jar最新版本,然後加入所在工程的lib中

Ehcache 對象、數據緩存:http://ehcache.org/downloads/destination?name=ehcache-core-2.5.2-distribution.tar.gz&bucket=tcdistributions&file=ehcache-core-2.5.2-distribution.tar.gz

Web頁面緩存:http://ehcache.org/downloads/destination?name=ehcache-web-2.0.4-distribution.tar.gz&bucket=tcdistributions&file=ehcache-web-2.0.4-distribution.tar.gz

2、在hibernate的相關配置中添加如下:

               <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>

3、需要在映射文件*.hbm.xml中<class name="" table="" > 節點下添加如下:

     <!-- 緩存策略 -->
     <cache usage="read-write"/>

4、在src根目錄下加入ehcache.xml文件,具體內容如下:

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

 <!-- 數據緩存存放目錄 -->
  <diskStore path="/jcms_cache_data/ehcache"/>
  <!--
   頁面緩存
   三種緩存算法:LRU-最近最少使用、LFU-較少頻率使用和FIFO-先進先出。

  參數詳解:

   simplePageCachingFilter 緩存的名稱
   maxElementsInMemory 緩存中元素的最大數量
   maxElementsOnDisk 持久化到硬盤的緩存元素的最大數量
   eternal="false"  如果爲true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false;
   overflowToDisk="true" 當緩存中元素數量超過限制時,將這些元素持久化到硬盤,爲false時,設置沒意義。
   timeToIdleSeconds 多長時間不訪問緩存,那麼就清除該緩存
   timeToLiveSeconds 緩存的存活時間
   -->
  <cache name="SimplePageCachingFilter" 
         maxElementsInMemory="10000" 
         maxElementsOnDisk="1000" 
         eternal="false" 
         overflowToDisk="true" 
         timeToIdleSeconds="5" 
         timeToLiveSeconds="30" 
         memoryStoreEvictionPolicy="LFU"/>
  
  <!-- Ehcache 對象、數據緩存用以下配置 -->
  <defaultCache  maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        diskSpoolBufferSizeMB="30"
        maxElementsOnDisk="10000000"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"/>
</ehcache>

5、web.xml中加入以下配置:

<!-- Ehcache頁面緩存配置 -->
   <filter> 
     <filter-name>PageCacheFilter</filter-name> 
        <filter-class>net.cnki.tpi.cms.util.PageCacheFilter</filter-class> 
        <!-- 初始化參數爲無需緩存的URL,多個以逗號分隔 -->
        <init-param>
         <param-name>notCacheUrlList</param-name>
         <param-value>/jcms/pcons/getUserManager.action</param-value>
        </init-param>
   </filter> 
  <filter-mapping> 
     <filter-name>PageCacheFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
  </filter-mapping>

 

5、寫一個Filter,繼承SimplePageCachingFilter,如下:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章