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文件必須遵守Ehcache的Xml 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的名稱。

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

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

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

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

       defaultTransactionTimeoutInSeconds:

       updateCheck:boolean類型,是否檢查更新,默認為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:指定當前緩存能夠使用的硬盤的最大字節數,其值可以是數字加單位,單位可以是K、M或者G,不區分大小寫,如:30G。當在CacheManager級別指定了該屬性后,Cache級別也可以用百分比來表示,如:60%,表示最多使用CacheManager級別指定硬盤容量的60%。該屬性也可以在運行期指定。當指定了該屬性后會隱式的使當前Cache的overflowToDisk為true。

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

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

 

maxElementsInMemory :cache 中最多可以存放的元素的數量。如果放入cache中的元素超過這個數值,有兩種情況:1、若overflowToDisk的屬性值為true,會將cache中多出的元素放入磁盤文件中。2、若overflowToDisk的屬性值為false,會根據memoryStoreEvictionPolicy的策略替換cache中原有的元素。      

 

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

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

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

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

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

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

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

       eternal:boolean類型,表示是否永恆,默認為false。如果設為true,將忽略timeToIdleSeconds和timeToLiveSeconds,Cache內的元素永遠都不會過期,也就不會因為元素的過期而被清除了。

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

       clearOnFlush:boolean類型。表示在調用Cache的flush方法時是否要清空MemoryStore。默認為true。

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

 

2.2     子元素

 

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

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

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

none:不持久化緩存的元素

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

 

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

 

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

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

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

 

 

3       defaultCache

       defaultCache元素是用來指定cache的默認配置的,其可以指定的信息大體上跟cache元素是一樣的。這些配置只會對在程序中通過CacheManager的addCache(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>

我們可以看到我們指定了defaultCache的copyOnRead和copyOnWrite為true,表示在讀和取的時候都會使用拷貝的副本。然后定義了一個叫test2的Cache。接着我們進行如下測試:

   @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指定緩存名稱的方式添加了一個叫cache1的Cache,該Cache將使用默認配置,即defaultCache指定的配置。然后我們定義了一個元素ele,並將其存放到cache1中,由於指定了copyOnWrite為true,所以在存放的時候其實存放的是ele的一個拷貝,而不是其引用。之后我們再從cache1中把ele拿出來並賦值給元素ele2,由於我們指定了copyOnRead為true,所以我們拿出來的會是緩存中ele的一個拷貝。之后我們對ele和ele2進行比較,其結果為false。然后我們往ehcache.xml中定義好的名叫test2的Cache中存入ele,因為test2沒有指定copyOnWrite為true,所以這里存放的是ele的引用。之后我們再從test2中讀取ele並賦值給ele3,因為我們沒有指定test2的copyOnRead為true,所以這里讀取出來的還是之前存放的ele的引用。之后再比較它們的地址,所得結果為相等。

 

4       diskStore元素

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

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

 

System.out.print(System.getProperty("java.io.tmpdir"));查詢目錄

 

如果不希望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所寫)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM