我有一个Java类,它有一个静态实现,可以获取缓存配置并实例化它,如下所示:
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.apache.log4j.Logger;
import java.net.URL;
public final class MyCacheImplementation {
private MyCacheImplementation() {
super();
}
private static Cache myCache;
private static final String EHCACHFILENAME = "....... ehcache.xml";
static {
try {
final URL url = MyCacheImplementation.class.getClassLoader().getResource(EHCACHFILENAME);
final CacheManager cacheManager = new CacheManager(url);
myCache = cacheManager.getCache("myCacheName);
} catch (final Exception e) {
throw new RuntimeException("Error initializing Ehcache", e);
}
}
public static void addItemToCache(final Object obj) {
myCache.put(new Element("obj1234", obj));
}
public static Cache getMyCache() {
return myCache;
}
}
然后我有一个以静态方式引用上述类的类,并查询缓存,如下所示:
final MyCacheImplementation cacheReference = MyCacheImplementation.getMyCache();
我的缓存配置如下所示:
<ehcache>
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />
<cache name="myCacheName" maxElementsInMemory="1000"
eternal="false" overflowToDisk="false" timeToIdleSeconds="18000"
diskPersistent="false"
timeToLiveSeconds="18000" />
</ehcache>
一切都按预期工作,我可以通过这种方式访问缓存。
然后我们将我们的EHCache版本升级到2.9并关闭了光盘商店 将上面的配置更改为:
<ehcache>
<defaultCache maxElementsInMemory="10000" timeToIdleSeconds="120" timeToLiveSeconds="120">
<persistence strategy="none" />
</defaultCache>
<cache name="myCacheName" maxElementsInMemory="1000" timeToIdleSeconds="18000" timeToLiveSeconds="18000">
<persistence strategy="none" />
</cache>
</ehcache>
现在如果我运行与上面相同的东西,我得到一个java.lang.NoClassDefFoundError:无法初始化类NoClassDefinition错误。如果我将EHCache配置回滚到原来的状态,那就完美了。知道这个配置有什么问题吗?我的代码中还有其他几个地方,配置完全相同,并没有引起任何问题?
答案 0 :(得分:0)
原来是吞下了实际的异常。
异常是在尝试使用以下错误消息初始化缓存时:
ehcache Element <defaultCache> does not allow nested <persistence> elements
事实证明,我对Hibernate缓存引入的旧版EHCache有依赖性,如this site所述