浏览 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自带的缓存机制没有遇到该问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-20
设个断点看一下EhCacheManager返回的EhCache实例是否是同一个,我怀疑可能是你的Ehcache没有正确受到Spring容器的管理。
|
|
返回顶楼 | |
发表时间:2011-11-25
1. EhCache 有专用的Spring扩展。
2. 不需要全局启用 EhCache吧。 |
|
返回顶楼 | |
发表时间:2011-12-19
1、报错报什么
2、spring不会在缓存失效之后再执行方法 3、把配置简化,看会不会有问题。 |
|
返回顶楼 | |
发表时间:2011-12-21
不知道,ehcache-spring-annotations这个插件还有没有用呢?
目前最新的只支持3.0.6 不知道会不会有3.1的出来呢。 |
|
返回顶楼 | |
发表时间: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再测试. |
|
返回顶楼 | |