2 he110jean he110jean 于 2017.01.06 15:41 提问

Spring 缓存@Cacheable 失效问题

service类

    @Cacheable(value = "ServTypeCache",key="#dimsCode")
    public DimsType getServByCode(String dimsCode){
        return cfgDao.getServByCode(dimsCode);
    }

xml

<cache:annotation-driven />  

    <!-- 创建spring cache bean -->  
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">  
        <property name="caches">  
                <set>
                    <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean">
                    <property name="name" value="ServTypeCache"/>
           </bean>
                    </set>  
        </property>  
    </bean>

Controller调用,每次都会打出sql,怎么回事呀

 DimsType dims = mConfigService.getServByCode(dimsCode);

8个回答

mashike1990
mashike1990   2017.09.06 01:39

额,我试过了。

cache:annotation-driven/ 放在Spring MVC 的配置文件里,Controller里调用,缓存是生效的,Junit不生效。

放到Spring的配置文件里,Controller调用缓存是不生效的,Junit生效。

所以,如果Spring 和 Spring MVC的配置文件是分开的,最好把cache:annotation-driven/在两边都加上。

至于为什么,我还不清楚。

dalingli14
dalingli14 非常感谢,碰到了Controller里调用不生效,Junit生效的问题,调试了很久没找到原因,按你提示在将Spring中的配置引用拷贝到 Spring MVC的配置文件,<cache:annotation-driven cache-manager="springCacheManager" proxy-target-class="false"/>,生效了。多谢
9 个月之前 回复
lvyuan1234
lvyuan1234   2017.09.12 17:04

在使用Spring @Cacheable注解的时候,要注意,如果类A的方法f()被标注了@Cacheable注解,那么当类A的其他方法,例如:f2(),去直接调用f()的时候,@Cacheable是不起作用的,原因是@Cacheable是基于Spring AOP代理类,f2()属于内部方法,直接调用f()时,是不走代理的

qq_26625037
qq_26625037   2017.01.06 15:58

去cfgDao.getServByCode这个方法里看看呢

he110jean
he110jean   2017.01.06 16:03
 public interface IConfigDaoMapper {

    public DimsType getServByCode(String dimsCode);

    public String getKeysByCode(String dimsCode);

}

cfgDao.getServByCode这个方法里没啥呀 是个mapper接口类

qq_26625037
qq_26625037   2017.01.06 16:20

这就显而易见了,sql是在**Mapper.xml中出现的,会显示在log中,是为了方便查找错误。

he110jean
he110jean   2017.01.06 16:27

用了缓存 应该只会查第一次的吧,所有应该只显示一次呀

NEWCIH
NEWCIH   2017.08.25 17:43

我也遇到这个问题了,楼主解决了没有呢?抱大腿。。

mashike1990
mashike1990   2017.09.06 00:20

求问楼主,最后是如何解决的?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Spring Cacheable标签 内部调用失效问题
如果你只是想使用一个轻量级的缓存方案,那么可以尝试使用Spring cache方案。那么在使用spring @Cacheable注解的时候,要注意,如果类A的方法f()被标注了@Cacheable注解,那么当类A的其他方法,例如:f2(),去直接调用f()的时候,@Cacheable是不起作用的,原因是@Cacheable是基于spring aop代理类,f2()属于内部方法,直接调用f()时,是不
springmvc+redis缓存问题(添加@Cacheable无效问题)
搭建时,遇到@Cacheable等注释无效,未将数据存入redis中,现将问题记录下解决方案: 主要的相关配置如下: 在applicationContext.xml中配置了redis相关配置,                                                -->                                   
使用Spring4.3解决缓存过期后多线程并发访问数据库的问题
缓存过期之后,如果多个线程同时请求对某个数据的访问,会同时去到数据库,导致数据库瞬间负荷增高。Spring4.3为@Cacheable注解提供了一个新的参数“sync”(boolean类型,缺省为false),当设置它为true时,只有一个线程的请求会去到数据库,其他线程都会等待直到缓存可用。这个设置可以减少对数据库的瞬间并发访问。
【spring】缓存超时设置
spring3.1之后引进了cache,我们可以使用CacheManager、Cache以及相关缓存注解将缓存集成到系统中,但spring并没有提供配置缓存超时的机制,笔者结合spring的 aspect实现了相关的超时设置功能 缓存配置文件: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xs
Spring @Cacheable注解类内部调用失效问题
如果你只是想使用一个轻量级的缓存方案,那么可以尝试使用Spring cache方案。但是,在使用Spring @Cacheable注解的时候,要注意,如果类A的方法f()被标注了@Cacheable注解,那么当类A的其他方法,例如:f2(),去直接调用f()的时候,@Cacheable是不起作用的,原因是@Cacheable是基于Spring AOP代理类,f2()属于内部方法,直接调用f()时,是
Spring Cache无效的问题以及解决办法
昨天碰到Cache无效的问题,现在已经找到原因并且解决。 把知识分享给大家,免得以后踩坑。 @Cacheable标注的方法,如果其所在的类实现了某一个接口,那么该方法也必须出现在接口里面,否则cache无效。 具体的原因是, Spring把实现类装载成为Bean的时候,会用代理包装一下,所以从Spring Bean的角度看,只有接口里面的方法是可见的,其它的都隐藏了,自然课看不到实现
自定义注解设置缓存有效期的正确姿势
http://www.jianshu.com/p/2633fb37862c
SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
Spring定义了org.springframework.cache.CacheManager和org.springframework.cache.Cache接口来统一不同的缓存技术,而 SpringBoot为我们提供了自动配置多个CacheManager的实现
@Cacheable在同一个类中方法调用不起作用
上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,再次调用时也没有走缓存。cacheable不支持内部方法调用的方式,需要修改为把请求缓存的改成service方式,Aservice中的genLiveBullets()调用Bservice中的queryLiveByRoom(),见下图,已测试再次调用时为
Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用注意点
1、当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。