Java 配置ehCache:缓存为空
我对使用任何缓存工具都是新手,我尝试过使用ehcache。。。在包含Java 配置ehCache:缓存为空,java,ehcache,Java,Ehcache,我对使用任何缓存工具都是新手,我尝试过使用ehcache。。。在包含条目的类路径中创建了我的ehcache.xml 但是当我试图从servlet的init方法访问缓存“xyz”时,我得到了null: cacheManger.getCache(“xyz”)//EhCache有一个可用于获取缓存的: CacheManager=newcachemanager(“src/config/ehcache.xml”); Cache Cache=manager.getCache(“xyz”); Element=
条目的类路径中创建了我的ehcache.xml
但是当我试图从servlet的init方法访问缓存“xyz”时,我得到了null
:
cacheManger.getCache(“xyz”)//EhCache有一个可用于获取缓存的:
CacheManager=newcachemanager(“src/config/ehcache.xml”);
Cache Cache=manager.getCache(“xyz”);
Element=cache.get(“key1”);
下面是来自ehcache.org的内容请确保您的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));
}
}
CacheManager cm=CacheManager.getInstance();
如果(cm!=null)
{
Set cacheNames=newhashset(Arrays.asList(cm.getCacheNames());
LOG.debug(“cacheNames:+cacheNames”);
用于(字符串cName:cacheNames)
{
LOG.debug(“缓存:+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>
你在使用哪个EhCacheManager
呢?是的。我试过了,它也能工作……但我想知道为什么Singleton方法不起作用……CacheManager.getInstance().getCache(“xyz”)和new CacheManager()之间有什么区别。getCache(“xyz”)没有区别。如果查看代码,getInstance()将调用create(),这是第一次执行:“singleton=new CacheManager();”。但根据您的问题,您没有使用CacheManager
,而是使用某种第三方实现:EhCacheManager
,我认为这是根本原因。使用net.sf.ehcache.CacheManager
解决了这个问题。这只是我创建的一个包装器…EhCacheMananger扩展了CacheManagerit,通过使用没有自定义包装器的ehcache API来实现。尽量不要用你的包装纸。一旦它在没有它的情况下工作了(它确实工作了),您就可以关注自定义包装器不工作的原因了。这确实是一个重要的注意事项:使用getEhCache()还将返回修饰过的缓存。