Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 配置ehCache:缓存为空_Java_Ehcache - Fatal编程技术网

Java 配置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。。。在包含
条目的类路径中创建了我的
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()还将返回修饰过的缓存。