我在Spring(3.1)中使用@Cacheable时有以下内容:
弹簧:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2
http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache" />
<!-- Ehcache library setup -->
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:config-location="classpath:ehcache.xml" />
的Maven:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.5.3</version>
</dependency>
要缓存的方法:
@Cacheable(value="cahceName", key="concat(#param1).concat(‘-’).concat(#param2)")
public String cachedMethod(String param1,String param2)
唉,当我调试代码时,我发现即使param1和param2相同(即没有使用cahce),缓存的方法也会被多次调用。
有什么想法吗?
答案 0 :(得分:15)
键显示不正确 -
你的意思可能是 - @Cacheable(value="cacheName", key="#param1.concat(‘-’).concat(#param2)")
此外,如果在没有调试信息的情况下完成编译,则表达式计算器将无法使用param1,param2参数名称。相反,您可以使用p0,p1等以这种方式引用它们:
@Cacheable(value="cahceName", key="#p0.concat('-').concat(#p1)")
更新:
我在这里有一个单页测试,演示了这是如何工作的 - https://gist.github.com/3315275
答案 1 :(得分:1)
就我而言,问题是由缓存提供程序(Caffeine)的错误配置引起的:
@Bean
public Caffeine<Object, Object> caffeineCacheBuilder() {
return Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(1000)
.expireAfterAccess(10, TimeUnit.MINUTES)
.weakKeys(); // cause problems when concatenated keys used
}
如文档所述,weakKeys()
方法:
指定应该将存储在缓存中的每个键(不是值)包装在WeakReference中(默认情况下,使用强引用)。
警告::使用此方法时,结果缓存将使用标识({@code ==}) 比较以确定键的相等性。因此,其{@link Cache#asMap}视图 在技术上违反了{@link Map}规范(与{@link IdentityHashMap}一样 )。