我在WebLogic 9.1实例上运行的webapp上使用EHCache 1.5.0。偶尔我从缓存中获取元素或检查缓存中是否存在某个项时遇到以下错误。还有其他人看过这个问题吗?关于如何解决这个问题的任何建议都会很棒。
导致此问题的代码:
getMyCache().isKeyInCache(cacheKey)
ehcache配置:
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="true"
我使用Spring来获取CacheManager的实例,这是我的bean定义:
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation"><value>classpath:ehcache.xml</value></property>
</bean>
错误如下:
java.lang.NullPointerException
at net.sf.ehcache.Cache.isElementInMemory(Cache.java:1962)
at net.sf.ehcache.Cache.isKeyInCache(Cache.java:2075)
at com.test.services.impl.ContentServicesImpl.getContentItemFromCache(ContentServicesImpl.java:260) ......
日志中没有其他内容指示在查找缓存中的密钥时出现NullPointerException的原因。
任何指针,如何解决此问题的建议将不胜感激。这不会持续发生,似乎在一个环境中随机发生。
答案 0 :(得分:0)
鉴于堆栈跟踪,似乎调用线程正在看到具有空MemoryStore的Cache(这是不可能的)。我怀疑这可能是CacheManager创建代码(双重检查锁定)或缓存本身中的内存可见性问题。我们已经收紧了很多针对Ehcache 1.7.1的现场可见性问题(尚未解决,但在几周内)。
这使得很难给出一个明确的解决方案但是一个糟糕的想法是添加一些弹簧初始化,它在启动期间保证早期只有一个线程构造了CacheManager。如果这使得问题消失了,那将有助于上述理论。