Spring整合Ehcache
0
Spring可以直接使用注解来缓存数据,这个非常不错的功能,但是今天遇到了一个小问题,记录一下。
下面两段代码:
@Cacheable("article")
public List<Article> findArticleNew()...
@Cacheable("article")
public List<Article> findArticleHot()...
这两个就会出现问题,本来是两个完全不同的逻辑但是查询出来的数据是一样的,那么为什么呢,原来如果你默认不配置key
的时候,Spring是根据参数来决定缓存的key
的。这两个都没有参数,所以key
是一样的,就会得到同样的值了。
解决问题:
@Cacheable(value = "article", key = "'article_new'")
public List<Article> findArticleNew()...
@Cacheable(value = "article", key = "'article_hot'")
public List<Article> findArticleHot()...
加上key
就可以了,注意key
的使用SpEL表达式。
Spring整合Ehcache有两种方法,Ehcache的配置我就不写了。
第一种配置:
xmlns:cache="http://www.springframework.org/schema/cache"
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
<cache:annotation-driven cache-manager="cacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:/ehcache.xml" />
<property name="shared" value="true" />
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehCacheManager" />
</bean>
使用:
@org.springframework.cache.annotation.Cacheable(value = "key")
@org.springframework.cache.annotation.CacheEvict(value = "key")
在方法上面注解,但是注意的是,默认的缓存键值
key
为参数,如果该方法没有参数时,请注意使用。
第二种配置:
xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring classpath:/com/googlecode/ehcache/annotations/ehcache-spring-1.1.xsd
<ehcache:annotation-driven />
<ehcache:config cache-manager="cacheManager">
<ehcache:evict-expired-elements interval="60" />
</ehcache:config>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:/ehcache.xml" />
</bean>
使用:
@com.googlecode.ehcache.annotations.Cacheable(cacheName = "key")
@com.googlecode.ehcache.annotations.TriggersRemove(cacheName = "key")
缓存的
key
和上面一样都是使用参数的,无参方法请注意。
同一个类里面的方法调用,不能使用注解,否者缓存无效,如果需要使用缓存,可以使用CacheManager
来做。