【发布时间】:2013-04-10 11:43:09
【问题描述】:
我们在项目中使用 ehcache 进行缓存。
import com.googlecode.ehcache.annotations.Cacheable;
// Other imports
@Component
public class Authenticator{
@Cacheable(cacheName = "rest_client_authorized")
public boolean isUserAuthorized(final String user, final String sessionId) {
// Method code
}
}
进入方法时没有缓存拦截器。到目前为止我们检查的内容:
- 我们不是从类内部调用这个方法,而是从外部调用。所以问题不在于导致绕过代理的内部调用。
- 我们为这个类添加了一个接口,并且我们更改了调用这个类的注入,以使用接口表示而不是具体类。
我们以这种方式在应用程序上下文中定义了缓存管理器:
<ehcache:annotation-driven cache-manager="ehCacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<!-- use a share singleton CacheManager -->
<property name="shared" value="true" />
</bean>
缓存是这样定义的:
<cache name="rest_client_authorized"
eternal="false"
maxElementsInMemory="50"
overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LRU" />
当我们使用 Jconsole 测试缓存管理器时,我们可以看到缓存 *rest_auth_disabled* 存在且为空。
任何关于为什么这不起作用的想法将不胜感激。谢谢!
更新(来自以下 cmets 的汇总):
===========================================**
这是一个遗留代码,可以很好地与我提供的类和定义配合使用。我在这里谈论的方法是新的,但班上的其他人在过去确实有效。因此,我们正在努力了解发生了什么变化。我们还尝试将注释替换为spring Cacheable,但仍然没有:/ 也许这取决于调用这个新方法的代码,它来自与我们用于其他方法的不同的spring bean。但我还是找不到问题。
还尝试在下面的答案之后返回布尔值而不是布尔值,但它不起作用。 我们有一个新的线索,可能与我们注入 bean 的方式有关(使用@Autowire)。如果确实如此,将更新。
【问题讨论】:
-
您使用什么持久性提供程序?使用休眠时,见HH-5303
-
好吧,我们确实使用了 Hibernate。但是我们已经在这个项目中使用了 @Cacheable 并且它有效。缓存缓存在内存中,而不是在 DB 中。另外,请注意这不是 JPA 注释,所以我不确定情况是否如此。你怎么看?
-
你是对的,我没有阅读实际的导入语句,并认为它是你在谈论的 JPA 注释。你用什么应用服务器?
-
嗯,我不知道那个服务器。您是否在 persistence.xml 中启用了缓存? "
"。不过,我不知道您的服务器是否需要。 -
tc-server 是tomcat7的spring版本,基本一致。即使我没有将数据库用作缓存,是否也需要启用此休眠属性?
标签: java spring ehcache spring-annotations