2

我在 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 的原因。

任何有关如何解决此问题的指示和建议将不胜感激。这不会始终如一地发生,似乎在一个环境中随机发生。

4

1 回答 1

0

鉴于堆栈跟踪,调用线程似乎看到了一个带有 null MemoryStore 的缓存(这应该是不可能的)。我偷偷怀疑这可能是 CacheManager 创建代码(双重检查锁定)或 Cache 本身中的内存可见性问题。我们已经加强了 Ehcache 1.7.1 的许多字段可见性问题(尚未发布,但几周后)。

这使得很难给出明确的修复,但一个糟糕的想法是添加一些弹簧初始化,以保证在启动早期只有一个线程构建了 CacheManager。如果这使问题消失,它将为上述理论提供一些可信度。

于 2009-11-06T19:41:52.847 回答