【问题标题】:Caching Methods in grailsgrails中的缓存方法
【发布时间】:2018-03-24 08:00:33
【问题描述】:

我正在寻找一种方法来缓存我在 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 秒。我做错了什么?

最好的问候, 彼得

【问题讨论】:

    标签: grails ehcache


    【解决方案1】:

    你如何调用你的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() 实现。这意味着我可以从MyService 中调用myMethod 并从缓存中取回值(如果存在)。

    【讨论】:

    • 非常感谢,当我在服务中调用该方法时,它可以正常工作
    • 现在我有一个问题,当服务方法调用服务方法时缓存应该。你知道如何解决这个问题吗?
    • 您是从同一个服务还是从不同的服务调用可缓存方法?如果它是不同的服务,那么没问题 - 方法调用将被拦截。如果您从同一个服务调用它 - 您可以使用一些笨拙的解决方法。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2011-06-15
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2011-05-25
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多