2011-10-12 151 views
1

我是使用任何緩存工具的新手,我嘗試過使用ehcache ...在包含<cache name="xyz" .../>條目的classpath中創建了我的ehcache.xml配置ehCache:緩存爲空

但是,當我試圖從一個我的servlet的init方法訪問我的緩存 「XYZ」,我得到null

cacheManger.getCache("xyz") // <= is "null" 

雖然

cacheManager.getCacheNames() 

是給我[xyz]

我使用的是以下代碼:

EhCacheManager.create(); 
ehcManager = EhCacheManager.getInstance(); 

System.out.println("getCacheNames::---" + Arrays.toString(ehcManager.getCacheNames())); //here I get "xyz" 

cache = ehcManager.getCache("xyz"); // here cache is null 
cache.getCacheEventNotificationService().registerListener(new EhCacheFlushEventListener()); 

任何想法...我錯過了什麼?

+0

你正在使用哪個'EhCacheManager'? – tolitius

回答

1

的Ehcache有CacheManager,你可以用它來獲得緩存:

CacheManager manager = new CacheManager("src/config/ehcache.xml"); 
Cache cache = manager.getCache("xyz"); 
Element element = cache.get("key1"); 

這裏是more examples從ehcache.org

+0

是的..我試過了,它的工作......但我想知道爲什麼singlton的方式不工作...什麼是CacheManager.getInstance()。getCache(「xyz」)和新的CacheManger()之間的區別getCache (「xyz」) – Chandan

+0

沒有區別。如果你看代碼,getInstance()調用create():「singleton = new CacheManager();」首次。但根據你的問題,你沒有使用'CacheManager',你正在使用某種第三方實現:'EhCacheManager',我相信這是根本原因。使用'net.sf.ehcache.CacheManager'解決了這個問題。 – tolitius

+0

多數民衆贊成只是我創建的包裝... EhCacheMananger擴展CacheManager – Chandan

1

確保您的ehcache.xml中的類路徑(根元素,不在子包中) 如果你使用maven項目結構,那麼把它放在/ src/main/resources目錄下。

這是對我的作品的代碼:

CacheManager cm = CacheManager.getInstance(); 
if (cm != null) 
{ 
    Set<String> cacheNames = new HashSet<String>(Arrays.asList(cm.getCacheNames())); 
    LOG.debug("cacheNames: " + cacheNames); 
    for(String cName: cacheNames) 
    { 
    LOG.debug("Cache: "+cm.getEhcache(cName)); 
    } 
} 

注:我使用的是 「getEhcache」 的方法,而不是 「getCache」

而且重新檢查您的ehcache.xml中配置,也許你缺少defaultCache元素,這裏舉一個例子:

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache maxBytesLocalHeap="1024m"> 
<sizeOfPolicy maxDepth="2000" /> 
<defaultCache eternal="false" timeToLiveSeconds="600"/> 
<cache name="myCacheablePOJO" eternal="true" statistics="true"> 
    <searchable> 
    <searchAttribute name="field1" /> 
    <searchAttribute name="field2" /> 
    <searchAttribute name="field3" /> 
    </searchable> 
</cache> 
</ehcache> 
+0

這確實是一個重要的注意事項:使用getEhCache()的 將返回裝飾緩存。 – Ronnie