grails 中的缓存方法

Pet*_*ter 2 grails ehcache

我正在寻找一种方法来缓存 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
    }
}
Run Code Online (Sandbox Code Playgroud)

我在控制器中的方法:

@Cacheable('inlinecache')
def inlineCache() {
    return new Date()
}
Run Code Online (Sandbox Code Playgroud)

我总是能得到实际的日期。我预计该值会持续 30 秒。我究竟做错了什么?

最好的问候,彼得

rcg*_*e23 6

你如何调用你的inlineCache方法?

如果您从同一个类中调用它,您实际上需要从 Spring 应用程序上下文获取对该服务的引用,并通过该引用调用该方法,而不是直接调用它。这样做的原因是因为 Spring 需要拦截您的方法调用,如果您直接从同一个类中调用该方法,它将无法拦截您的方法调用。

更新:

如果您想从同一服务中调用缓存的方法,您需要执行以下操作:

class MyService {
    String myMethod(String argument) {
        return grailsApplication.mainContext.myService.myMethodCacheable(argument);
    }

    @Cacheable(value="myCacheName")
    String myMethodCacheable(String argument) {          
        return ""
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,只需从 spring 应用程序上下文myMethod获取引用并委托给其中的实现即可。这意味着我可以从内部调用并从缓存中取回值(如果存在)。MyServicemyMethodCacheable()myMethodMyService