天天看點

Ehcache(02)——ehcache.xml簡介 1       ehcache元素 2       cache元素 3       defaultCache 4       diskStore元素

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做一個簡要的介紹,主要介紹常用的配置項。

       首先我們的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.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。

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

       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。

       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(先進先出)。

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

l  localTempSwap:當堆記憶體或者非堆記憶體裡面的元素已經滿了的時候,将其中的元素臨時的存放在磁盤上,一旦重新開機就會消失。

l  localRestartable:該政策隻對企業版Ehcache有用。它可以在重新開機的時候将堆記憶體或者非堆記憶體裡面的元素持久化到硬碟上,重新開機之後再從硬碟上恢複元素到記憶體中。

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

l  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。

l  localMemory:表示将元素固定在記憶體中。

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

       defaultCache元素是用來指定cache的預設配置的,其可以指定的資訊大體上跟cache元素是一樣的。這些配置隻會對在程式中通過CacheManager的addCache(String cacheName)方法添加的Cache起作用。

       假設我們的ehcache.xml檔案的内容如下:

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

       我們通過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的引用。之後再比較它們的位址,所得結果為相等。

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

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