2013-03-12 88 views
1

我有一个dao方法用@Cacheable注解,但是它的缓存根本不起作用。我把日志消息放在方法里面。Spring @Cacheable不能正常工作

<cache:annotation-driven mode="proxy" proxy-target-class="true" cache-manager="cacheManager" /> 
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
     <property name="configLocation" value="WEB-INF/ehcache/ehcache.xml"></property> 
     <property name="shared" value="true"></property> 
    </bean> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
     <property name="cacheManager" ref="ehcache"></property> 
    </bean> 

@Controller 
@RequestMapping(value = "/analytics") 
public class AnalyticsController { 

    @Autowired 
    private ReportDao reportDao; 

    /** 
    * 
    */ 
    public AnalyticsController() { 
    } 

    @RequestMapping(value = "/lcr-report", method = RequestMethod.GET) 
    public String viewCostReport(ModelMap map) { 

     List<Country> countryList = reportDao.getAllCountry(); 

     map.put("countryList", countryList); 

     return "lcrReport"; 
    } 

} 


@Repository 
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, 
    rollbackFor={DataAccessException.class, SQLException.class, Exception.class}) 
public class ReportDao { 

    @Autowired 
    private JdbcTemplate dao; 

    /** 
    * 
    */ 
    public ReportDao() { 
    } 

    @Cacheable(value = {"reportDao"}/*, key= "T(Country).hash(#List<Country>)"*/) 
    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, readOnly=true, 
      rollbackFor={DataAccessException.class, SQLException.class, Exception.class}) 
    public List<Country> getAllCountry() { 
     List<Country> countryList = null; 
     BeanPropertyRowMapper<Country> mapper = new BeanPropertyRowMapper<Country>(Country.class); 
     PreparedStatementCreator psc = new GenericPreparedStatementCreator("select c.country_code as countryCode, c.name as countryName from country c"); 
     System.out.println("Not from cache"); 
     countryList = dao.query(psc, mapper); 

     return countryList; 
    } 

} 
+0

如何在该方法上添加列表的密钥? – peterwkc 2013-03-12 07:17:07

+0

我认为你的'ehcache.xml'有问题。请张贴它。 – 2013-03-12 07:18:48

回答

2

您应该使用方法getAllCountry的参数创建密钥。在你的情况下,它是空的,所以你可以这样做:

@Transactional(readOnly = true) 
@Cacheable(value = CACHE_NAME, key = "'countries'") 

,并检查其是否工作正常使用地图缓存:

@Configuration 
@EnableCaching(proxyTargetClass = true) 
public class CacheProducer { 

@Bean 
public CacheManager cacheManager() { 
     SimpleCacheManager result = new SimpleCacheManager(); 
     result.setCaches(Arrays.asList(new ConcurrentMapCache(DictionaryServiceImpl.CACHE_NAME))); 
     return result; 
    } 
} 

如果它的工作原理 - 这是时间来检查你的echache配置。

+0

我使用记录器测试了多个呼叫,它可以工作。 – peterwkc 2013-03-12 08:30:19