天天看點

緩存之EHCache(一)

轉載已查不到出處
緩存之EHCache(一)

一、簡介

非常簡單,而且易用。

    ehcache 是一個非常輕量級的緩存實作,而且從1.2 之後就支援了叢集,而且是hibernate 預設的緩存provider。ehcache 是一個純Java的程序内緩存架構,具有快速、精幹等特點,是Hibernate中預設的CacheProvider。

ehcache可以直接使用。也可以和Hibernate對象/關系架構結合使用。還可以做Servlet緩存。

Cache 存儲方式 :記憶體或磁盤。

官方網站:http://ehcache.sourceforge.NET/

主要特征:

1. 快速.

2. 簡單.

3. 多種緩存政策

4. 緩存資料有兩級:記憶體和磁盤,是以無需擔心容量問題

5. 緩存資料會在虛拟機重新開機的過程中寫入磁盤

6. 可以通過RMI、可插入API等方式進行分布式緩存

7. 具有緩存和緩存管理器的偵聽接口

8. 支援多緩存管理器執行個體,以及一個執行個體的多個緩存區域

9. 提供Hibernate的緩存實作

10. 等等

二、快速上手

1、  項目類庫中添加ehcache.jar;

2、  在類路徑下編寫ehcache.xml配置檔案。

三、配置檔案參數詳解

ehcache.xml是ehcache的配置檔案,并且存放在應用的classpath中。下面是對該XML檔案中的一些元素及其屬性的相關說明: 

<diskStore>元素:指定一個檔案目錄,當EHCache把資料寫到硬碟上時,将把資料寫到這個檔案目錄下。 下面的參數這樣解釋:   

         user.home – 使用者主目錄   

         user.dir      – 使用者目前工作目錄   

         java.io.tmpdir – 預設臨時檔案路徑

<defaultCache>元素:設定緩存的預設資料過期政策。 

<cache>元素:設定具體的命名緩存的資料過期政策。

<cache>元素的屬性 

        name:緩存名稱。通常為緩存對象的類名(非嚴格标準)。 

        maxElementsInMemory:設定基于記憶體的緩存可存放對象的最大數目。 

        maxElementsOnDisk:設定基于硬碟的緩存可存放對象的最大數目。  

        eternal:如果為true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false; 

        timeToIdleSeconds: 設定允許對象處于空閑狀态的最長時間,以秒為機關。當對象自從最近一次被通路後,如果處于空閑狀态的時間超過了timeToIdleSeconds屬性值,這個對象就會過期。當對象過期,EHCache将把它從緩存中清空。隻有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處于空閑狀态。 

        timeToLiveSeconds:設定對象允許存在于緩存中的最長時間,以秒為機關。當對象自從被存放到緩存中後,如果處于緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期。當對象過期,EHCache将把它從緩存中清除。隻有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在于緩存中。timeToLiveSeconds必須大于timeToIdleSeconds屬性,才有意義。 

        overflowToDisk:如果為true,表示當基于記憶體的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出的對象寫到基于硬碟的緩存中。注意:如果緩存的對象要寫入到硬碟中的話,則該對象必須實作了Serializable接口才行。

memoryStoreEvictionPolicy:緩存對象清除政策。有三種:

        1 FIFO ,first in first out ,這個是大家最熟的,先進先出,不多講了

        2 LFU , Less Frequently Used ,就是上面例子中使用的政策,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的将會被清出緩存。

        2 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離目前時間最遠的元素将被清出緩存。

四、單獨使用EHCache

1.建立CacheManager (net.sf.ehcache.CacheManager)

(1)使用預設配置檔案建立

1

CacheManager manager = CacheManager.create();

(2)使用指定配置檔案建立

1

CacheManager manager = CacheManager.create(

"src/config/ehcache.xml"

);

(3)從classpath找尋配置檔案并建立

1

URL url = getClass().getResource(

"/anothername.xml"

);

2

CacheManager manager = CacheManager.create(url);

(4)通過輸入流建立

1

InputStream fis = 

new

FileInputStream(

new

File(

"src/config/ehcache.xml"

).getAbsolutePath());

2

try

3

manager = CacheManager.create(fis);

4

finally

5

fis.close(); 

6

}

2.建立Caches (net.sf.ehcache.Cache)

(1)取得配置檔案中預先 定義的sampleCache1設定,生成一個Cache

1

Cache cache = manager.getCache(

"sampleCache1"

);

(2)設定一個名為test 的新cache,test屬性為預設

1

CacheManager manager = CacheManager.create();

2

manager.addCache(

"test"

);

(3)設定一個名為test 的新cache,并定義其屬性

1

CacheManager manager = CacheManager.create();

2

Cache cache = 

new

Cache(

"test"

1

true

false

5

2

);

3

manager.addCache(cache);

(4)删除cache

1

CacheManager singletonManager = CacheManager.create();

2

singletonManager.removeCache(

"sampleCache1"

);

3.使用Caches

(1)往cache中加入元素

1

Element element = 

new

Element(

"key1"

"value1"

);

2

cache.put(

new

Element(element);

(2)從cache中取得元素

1

Element element = cache.get(

"key1"

);

(3)從cache中删除元素

1

Cache cache = manager.getCache(

"sampleCache1"

);

2

Element element = 

new

Element(

"key1"

"value1"

);

3

cache.remove(

"key1"

);

4.解除安裝CacheManager ,關閉Cache

1

manager.shutdown();

下附代碼。

五、在 Hibernate 中運用EHCache

1、hibernate.cfg.xml中需設定如下:

3系列版本加入

1

<

property

name=” hibernate.cache.provider_class”>

2

org.hibernate.cache.EhCacheProvider

3

</

property

>

EhCacheProvider類位于hibernate3.jar

2.1版本加入

net.sf.ehcache.hibernate.Provider

2.1以下版本加入

net.sf.hibernate.cache.EhCache

 2、在Hibernate3.x中的etc目錄下有ehcache.xml的示範檔案,将其複制應用程式的src目錄下(編譯時會把ehcache.xml複制到WEB-INF/classess目錄下),對其中的相關值進行更改以和自己的程式相适合。

 3、持久化類的映射檔案進行配置

1

<

cache

usage

=

"read-write"

/>

在<set>标記中設定了<cache usage="read-write"/>,但Hibernate僅把和Group相關的Student的主鍵id加入到緩存中,如果希望把整個Student的散裝屬性都加入到二級緩存中,還需要在Student.hbm.xml檔案的<class>标記中加入<cache>子标記,如下所示:

1

<

cache

usage

=

"read-write"

/> 

<!--cache标記需跟在class标記後-->

 注:SSH中hibernate配置的cache資訊

1

<

prop

key

=

"hibernate.cache.provider_class"

>org.hibernate.cache.EhCacheProvider</

prop

>

繼續閱讀