论坛首页 Java企业应用论坛

使用Spring3.1 Cache注解+EHCache遇到的问题

浏览 5465 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-20   最后修改:2011-10-20

关于Spring3.1 Cache注解的介绍请参看http://hanqunfeng.iteye.com/blog/1158824

 

这里只说一下遇到的问题,web应用,session超时为30分钟,使用Cache注解+EHCache,如下:

 
<cache name="andCache" maxElementsInMemory="10000"  
        maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"  
        diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"  
        memoryStoreEvictionPolicy="LFU" />  

说明:缓存名andCache,内存中最多可缓存10000个Element,其中的element会在闲置5分钟或是存活10分钟之后失效,

超过10000element时,element将会输出到磁盘中。

 

结果,在登录系统后,如果超过5分钟不访问系统,则会出现异常,

按照这样配置,我原以为,如果5分钟之内不访问应用,则缓存会失效,那么spring就会重新执行原先被缓存的方法,但实际上,方法并没有被重新执行,而是返回了null,貌似spring依旧是从缓存中查找,并且找到了key,只不过value已经是null了。

 

这样就会导致系统出现空指针异常,况且session也尚未超时,

但就算是将闲置时间设置为30分钟以上,用户在下次登录时一样会出现异常,但是第二次登录就又会正常,然后周而复始,貌似,只有当第一次取到null后,spring才会重新执行方法。

 

感觉上,好像ehcache清除缓存后,spring并不知道,因为key依旧可以在spring的cache中找到,但是通过key取值 时,spring会从ehcache中查找,由于ehcache已经清除了缓存,所以返回值一定是null,而spring也把这个null当成了被缓存 的value返回给系统。

 

使用spring自带的缓存机制没有遇到该问题。

   发表时间:2011-10-20  
设个断点看一下EhCacheManager返回的EhCache实例是否是同一个,我怀疑可能是你的Ehcache没有正确受到Spring容器的管理。
0 请登录后投票
   发表时间:2011-11-25  
1. EhCache 有专用的Spring扩展。
2. 不需要全局启用 EhCache吧。
0 请登录后投票
   发表时间:2011-12-19  
1、报错报什么
2、spring不会在缓存失效之后再执行方法
3、把配置简化,看会不会有问题。
0 请登录后投票
   发表时间:2011-12-21  
不知道,ehcache-spring-annotations这个插件还有没有用呢?
目前最新的只支持3.0.6
不知道会不会有3.1的出来呢。
0 请登录后投票
   发表时间:2012-05-09  
用3.1.1的spring cache + ehcache没有发现这个问题哦.
看org.springframework.cache.ehcache.EhCacheCache的代码,其实是对net.sf.ehcache.Ehcache.Ehcache的一个代理。
[感觉上,好像ehcache清除缓存后,spring并不知道,因为key依旧可以在spring的cache中找到,但是通过key取值时,spring会从ehcache中查找,由于ehcache已经清除了缓存,所以返回值一定是null,而spring也把这个null当成了被缓存的value返回给系统。]
EhCacheCache里面并没有保持key值。key值是外部传过来直接pass给ehcache了。见以下的代码。
public ValueWrapper get(Object key) {
Element element = this.cache.get(key);
return (element != null ? new SimpleValueWrapper(element.getObjectValue()) : null);
}

可以用3.1.1再测试.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics