我正在寻找一种方法来缓存Grails中某些方法的返回值。我发现插件ehcache(https://grails.org/plugin/cache-ehcache)看起来非常好。
但我不能让我的榜样上班。我想使用@Cachable表示法。 我在Config.groovy中的配置:
grails{
cache {
enabled = true
ehcache {
reloadable = false
}
}
}
grails.cache.config = {
cache {
name 'inlinecache'
eternal false
enabled true
overflowToDisk true
maxElementsInMemory 10000
maxElementsOnDisk 10000000
timeToLiveSeconds 30
}
}
我在Controller中的方法:
@Cacheable('inlinecache')
def inlineCache() {
return new Date()
}
我总是得到实际的约会。我希望这个值持续30秒。我做错了什么?
祝你好运, 彼得
答案 0 :(得分:4)
您如何调用inlineCache
方法?
如果您在同一个类中调用它,您实际上需要从Spring应用程序上下文中获取对该服务的引用,并通过该方法调用该方法而不是直接调用它。这样做的原因是Spring需要拦截你的方法调用,如果你直接从同一个类中调用该方法,它就无法实现。
<强>更新强>
如果您想在同一服务中调用缓存方法,则需要按照以下方式执行操作:
class MyService {
String myMethod(String argument) {
return grailsApplication.mainContext.myService.myMethodCacheable(argument);
}
@Cacheable(value="myCacheName")
String myMethodCacheable(String argument) {
return ""
}
}
所以myMethod
只是从spring应用程序上下文中获取对MyService
的引用,并委托给那里的myMethodCacheable()
实现。这意味着我可以在myMethod
内调用MyService
并从缓存中获取值(如果存在)。