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);

额,我试过了。

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

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

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

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

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

 public interface IConfigDaoMapper {

    public DimsType getServByCode(String dimsCode);

    public String getKeysByCode(String dimsCode);

}

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

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

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

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

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

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