Ehcache(02)——ehcache.xml簡介

ehcache.xml簡介

 

       ehcache.xml文件是用來定義Ehcache的配置信息的,更準確的來說它是定義CacheManager的配置信息的。根據之前我們在《Ehcache簡介》一文中對CacheManager的介紹我們知道一切Ehcache的應用都是從CacheManager開始的。在不指定配置信息參數創建CacheManager時,CacheManager將首先在類路徑的根目錄下尋找一個叫ehcache.xml的文件作爲CacheManager的配置文件。如果不存在這樣的文件則將使用封裝在ehcache jar包中的ehcahce-failsafe.xml文件作爲創建CacheManager的默認配置信息。除了使用Configuration作爲參數外,使用其它參數構造CacheManager都是基於xml格式的配置信息的。當我們使用xml配置文件作爲CacheManager的配置信息時,我們的文件名不一定叫ehcache.xml,這裏只是把ehcache.xml文件作爲這一類文件的一個代表,它們擁有共同的文檔結構。本文將對ehcache.xml做一個簡要的介紹,主要介紹常用的配置項。

1       ehcache元素

       首先我們的ehcache.xml文件必須遵守EhcacheXml Schema的定義,我們可以直接使用在線的http://ehcache.org/ehcache.xsd,也可以直接從該地址把ehcache.xsd文件下載到本地。ehcache.xml文件的根元素必須是ehcache,一個ehcache元素就相當於一個CacheManager,我們在ehcache元素上指定的屬性以及在ehcache元素下定義的子元素都是針對於當前CacheManager的,比如我們在ehcache元素下定義了一個cache元素,那就代表我們所定義的CacheManager中有這麼一個Cache存在。ehcache元素上的屬性都是可選的,我們可以在ehcache元素上指定ehcache.xml文件所遵循的schema所在的位置,如:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
 
</ehcache>

 

 

1.1     可選屬性

       除了指定ehcache.xml文件所遵循的schema之外,我們的ehcache元素還可以指定很多的屬性,主要有如下這些。

       name:指定當前CacheManager的名稱。

       dynamicConfigboolean類型。表示是否可以動態的更新配置,默認爲true。當設置爲false的時候,我們在運行期通過CacheManagerConfiguration來改變配置信息時將不會發生作用。使用代碼進行配置時我們可以通過Configuration對象的dynamicConfig(boolean dynamicConfig)方法來指定該配置。

       maxBytesLocalDisk:在CacheManager級別指定能夠使用的本地磁盤的最大容量。當指定了該屬性後隱式的使所有CacheoverflowToDisk變爲true,如需關閉則需要在對應的Cache上設置overflowToDiskfalse

       maxBytesLocalHeap:在CacheManager級別指定能夠使用的堆內存的最大容量。

       maxBytesLocalOffHeap:在CacheManager級別指定能夠使用的非堆內存的最大容量。當指定了該屬性後會隱式的使所有CacheoverflowToDisk變爲true,如需關閉則需在對應的Cache上設置overflowToOffHeapfalse。該屬性只對企業版Ehcache有用。

       defaultTransactionTimeoutInSeconds:

       updateCheckboolean類型,是否檢查更新,默認爲true。當設置爲true時,CacheManager會定期的從網上去檢查當前的Ehcache是否是最新的版本,如果不是,則會將比當前版本新的版本列出來。

 

       需要注意的是當我們在CacheManager級別上指定了maxBytesLocalOffHeap時會使overflowToOffHeap的默認值變爲true。也就是說該CacheManager裏面所有的Cache在沒有顯示的指定overflowToOffHeap屬性值時其值默認都是true,原本默認是false

2       cache元素

       cache元素是ehcache元素的子元素,一個cache元素就代表一個Ehcache對象的定義。對於一個cache元素而言我們最簡單的定義方式是只需要指定所定義的Ehcache的名稱,其它的都使用默認配置。默認配置將使用defaultCache元素的定義(這將在後文中講到)。

2.1     屬性

       cache元素中可以指定的屬性也有很多,但只有一個是必須的。那就是name屬性。

       name:指定cache的名稱。

       maxEntriesLocalDisk:指定允許在硬盤上存放元素的最大數量,0表示不限制。這個屬性我們也可以在運行期通過CacheConfiguration來更改。

       maxEntriesLocalHeap:指定允許在內存中存放元素的最大數量,0表示不限制。這個屬性也可以在運行期動態修改。

       maxEntriesInCache:指定緩存中允許存放元素的最大數量。這個屬性也可以在運行期動態修改。但是這個屬性只對Terracotta分佈式緩存有用。

       maxBytesLocalDisk:指定當前緩存能夠使用的硬盤的最大字節數,其值可以是數字加單位,單位可以是KM或者G,不區分大小寫,如:30G。當在CacheManager級別指定了該屬性後,Cache級別也可以用百分比來表示,如:60%,表示最多使用CacheManager級別指定硬盤容量的60%。該屬性也可以在運行期指定。當指定了該屬性後會隱式的使當前CacheoverflowToDisktrue

       maxBytesLocalHeap:指定當前緩存能夠使用的堆內存的最大字節數,其值的設置規則跟maxBytesLocalDisk是一樣的。

       maxBytesLocalOffHeap:指定當前Cache允許使用的非堆內存的最大字節數。當指定了該屬性後,會使當前CacheoverflowToOffHeap的值變爲true,如果我們需要關閉overflowToOffHeap,那麼我們需要顯示的指定overflowToOffHeap的值爲false

       overflowToDiskboolean類型,默認爲false。當內存裏面的緩存已經達到預設的上限時是否允許將按驅除策略驅除的元素保存在硬盤上,默認是LRU(最近最少使用)。當指定爲false的時候表示緩存信息不會保存到磁盤上,只會保存在內存中。該屬性現在已經廢棄,推薦使用cache元素的子元素persistence來代替,如:<persistence strategy=”localTempSwap”/>

       diskSpoolBufferSizeMB:當往磁盤上寫入緩存信息時緩衝區的大小,單位是MB,默認是30

       overflowToOffHeapboolean類型,默認爲false。表示是否允許Cache使用非堆內存進行存儲,非堆內存是不受Java GC影響的。該屬性只對企業版Ehcache有用。

       copyOnRead:當指定該屬性爲true時,我們在從Cache中讀數據時取到的是Cache中對應元素的一個copy副本,而不是對應的一個引用。默認爲false

       copyOnWrite:當指定該屬性爲true時,我們在往Cache中寫入數據時用的是原對象的一個copy副本,而不是對應的一個引用。默認爲false

       timeToIdleSeconds:單位是秒,表示一個元素所允許閒置的最大時間,也就是說一個元素在不被請求的情況下允許在緩存中待的最大時間。默認是0,表示不限制。

       timeToLiveSeconds:單位是秒,表示無論一個元素閒置與否,其允許在Cache中存在的最大時間。默認是0,表示不限制。

       eternalboolean類型,表示是否永恆,默認爲false。如果設爲true,將忽略timeToIdleSecondstimeToLiveSecondsCache內的元素永遠都不會過期,也就不會因爲元素的過期而被清除了。

       diskExpiryThreadIntervalSeconds :單位是秒,表示多久檢查元素是否過期的線程多久運行一次,默認是120秒。

       clearOnFlushboolean類型。表示在調用Cacheflush方法時是否要清空MemoryStore。默認爲true

       memoryStoreEvictionPolicy:當內存裏面的元素數量或大小達到指定的限制後將採用的驅除策略。默認是LRU(最近最少使用),可選值還有LFU(最不常使用)和FIFO(先進先出)。

 

2.2     子元素

 

       persistence:表示Cache的持久化,它只有一個屬性strategy,表示當前Cache對應的持久化策略。其可選值如下:

l  localTempSwap:當堆內存或者非堆內存裏面的元素已經滿了的時候,將其中的元素臨時的存放在磁盤上,一旦重啓就會消失。

l  localRestartable:該策略只對企業版Ehcache有用。它可以在重啓的時候將堆內存或者非堆內存裏面的元素持久化到硬盤上,重啓之後再從硬盤上恢復元素到內存中。

l  none:不持久化緩存的元素

l  distributed:該策略不適用於單機,是用於分佈式的。

 

       copyStrategy:當我們指定了copyOnReadcopyOnWritetrue時,就會用到我們的copyStrategy,即拷貝策略了。默認的copyStrategy是通過序列化來實現的,我們可以通過實現net.sf.ehcache.store.compound.CopyStrategy接口來實現自己的CopyStrategy,然後只需在cache元素下定義一個copyStrategy元素並指定其class屬性爲我們的CopyStrategy實現類。如:<copyStrategy class="xxx.xxx.xxx"/>

 

       pinning:表示將緩存內的元素固定住,除非過期,否則不會對它進行刪除和驅除到其它儲存容器中。pinning元素只定義了一個屬性store,表示將把元素固定在哪個位置。其可選值有localMemoryinCache

l  localMemory:表示將元素固定在內存中。

l  inCache:表示將元素固定在任何其正在保存的容器中。

3       defaultCache

       defaultCache元素是用來指定cache的默認配置的,其可以指定的信息大體上跟cache元素是一樣的。這些配置只會對在程序中通過CacheManageraddCache(String cacheName)方法添加的Cache起作用。

       假設我們的ehcache.xml文件的內容如下:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalDisk="20G" maxBytesLocalHeap="10M">
     
   <defaultCache copyOnRead="true" copyOnWrite="true" overflowToOffHeap="false"/>
 
   <cache name="test2" overflowToOffHeap="false"/>
  
</ehcache>

 

 

       我們可以看到我們指定了defaultCachecopyOnReadcopyOnWritetrue,表示在讀和取的時候都會使用拷貝的副本。然後定義了一個叫test2Cache。接着我們進行如下測試:

   @Test
   publicvoid testDefaultCache() {
      CacheManager cacheManager = CacheManager.create();
      //cache1將使用默認配置
      cacheManager.addCache("cache1");
      Cache cache1 = cacheManager.getCache("cache1");
      Element ele = new Element("key", "value");
      cache1.put(ele);
      Element ele2 = cache1.get("key");
      System.out.println(ele == ele2);  //false
     
      Cache test2 = cacheManager.getCache("test2");
      test2.put(ele);
      Element ele3 = test2.get("key");
      System.out.println(ele == ele3);  //true
   }

 

 

       我們通過cacheManager指定緩存名稱的方式添加了一個叫cache1Cache,該Cache將使用默認配置,即defaultCache指定的配置。然後我們定義了一個元素ele,並將其存放到cache1中,由於指定了copyOnWritetrue,所以在存放的時候其實存放的是ele的一個拷貝,而不是其引用。之後我們再從cache1中把ele拿出來並賦值給元素ele2,由於我們指定了copyOnReadtrue,所以我們拿出來的會是緩存中ele的一個拷貝。之後我們對eleele2進行比較,其結果爲false。然後我們往ehcache.xml中定義好的名叫test2Cache中存入ele,因爲test2沒有指定copyOnWritetrue,所以這裏存放的是ele的引用。之後我們再從test2中讀取ele並賦值給ele3,因爲我們沒有指定test2copyOnReadtrue,所以這裏讀取出來的還是之前存放的ele的引用。之後再比較它們的地址,所得結果爲相等。

 

4       diskStore元素

       diskStore元素是用來指定磁盤存儲的路徑的,其只接收一個參數path,表示表示磁盤存儲的路徑。如:

   <diskStore path="d:\\ehcache" />

  

       如果不希望Ehcache創建磁盤存儲的路徑,則可以不定義diskStore元素。在沒有定義diskStore,但有cache需要使用磁盤存儲時會默認使用java.io.tmpdir作爲磁盤存儲的路徑。

       diskStore元素的path屬性使用如下值時將自動替換爲實際對應的值。

l  java.io.tmpdir:默認的臨時文件存放路徑。

l  user.home:用戶的主目錄。

l  user.dir:用戶的當前工作目錄,即當前程序所對應的工作路徑。

l  其它通過命令行指定的系統屬性,如“java –DdiskStore.path=D:\\abc ……”。

 

(注:本文是基於Ehcache2.8.1所寫)

 

 

 

 

 

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