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"/>,生效了。多谢
大约 2 个月之前 回复
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

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

lvyuan1234
lvyuan1234   2017.09.12 17:04

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!