2009-07-31 15:47:29softlive

Ehcache+Spring範例測試

情境:某個功能實在太慢,又不想寫PL/pgSQL,測試Ehcache的效益。
網路上多是spring+hibernate+Ehcache,找了半天才找到一個完整的spring+Ehcache範例

這個範例是run在一個unit test,Dao get 的bean不是從DB拿而是spring設定檔中自行輸入的。
cache name那一段有點要注意,如果pointcut的method有參數,
程式會產生另一個cache name,然後ehcache因為找不到還是使用default設定而非ehcache.xml上的getAllAtms。
其他必須lib - aspectjrt.jar,aspectjweaver.jar,commons-lang.jar,commons-logging.jar,spring-test.jar。
使用ehcache-1.6.1.jar,spring-2.5.6.jar,作者用了2個Interceptor,一個印出時間,另一個就是操作cache。

完整netbeans專案檔。

還有其他調校,就必須依實際系統運作情形而調整。比如說,有的資料異動以週為單位,cache存在時間就可以久一點。
以天為單位,當然不能太久。以小時為單位,就要設更短。CACHE分配設計...。

改到自己web專案設定如下。印時間的Interceptor就不用了。
ehcache.xml從classpath改成相對war file的路徑(ehcache.xml copy到WEB-INF下)。
        
                     pointcut="execution(* *..YourSlowDaoBeanIf.listOfXxx(..))" />



    
        /WEB-INF/ehcache.xml
        
    




        


如果要REFRESH得到最新資料,就想辦法CALL Cache.removeAll()。

ehcache.xml屬性解釋,從大陸網站取得轉碼編輯過:

元素:指定一個目錄在java系統參數中(java.io.tmpdir),windows預設在C:Documents and Settings$YOUR_PC_NAME$Local SettingsTemp下,
當EHCache把資料寫到硬碟上時,將把資料寫到這個目錄下。
元素:預設的CACHE設定實體。
元素:預設以外的CACHE設定實體。
元素的屬性
name:CACHE名稱。
maxElementsInMemory:設置基於記憶體的CACHE可存放物件的最大數目。
maxElementsOnDisk:設置基於硬碟的CACHE可存放物件的最大數目。
eternal:如果為true,表示物件永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false;
timeToIdleSeconds: 設定允許物件處於閒置狀態的最長時間,以秒為單位。
當物件自從最近一次被呼叫後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期。
當對象過期,EHCache將把它從CACHE中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示物件可以無限期地處於閒置狀態。
timeToLiveSeconds:設定對象允許存在於CACHE中的最長時間,以秒為單位。當物件自從被存放到緩存中後,如果處於CACHE中的時間超過了 timeToLiveSeconds屬性值,這個物件就會過期。
當對象過期,EHCache將把它從CACHE中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示物件可以無限期地存在於CACHE中。
timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義。
overflowToDisk:如果為true,表示當基於記憶體的CACHE中的物件數目達到了maxElementsInMemory上限後,會把物件寫到硬碟的CACHE中。