控制器动作缓存在使用Grails缓存插件时似乎无法工作



Grails Version: 3.0.9

Groovy Version: 2.4.5

JVM版本:1.8.0_60

我正在使用Grails缓存插件

http://grails-plugins.github.io/grails-cache/3.0.1/guide/index.html

我已经有一些成功的缓存服务方法,如:
@Transactional
class EventCategoryService {
    @Cacheable('eventCategory')
    def findAllSports() {
        def sportCategories
        log.info('called EventCategoryService.findAllSports')
        sportCategories = EventCategory.findAllByParentCategoryName("Sport", [sort: "order"])
    }
}

一旦缓存被创建,我不再看到'called EventCategoryService。findAllSports'在后续呼叫的日志中出现。

然而,在一个名为"控制器动作缓存"的章节中,插件声明"你也可以使用相同的注释来缓存web请求的响应"。

@Cacheable('eventCategory')
def index(IndexCommand command) {
    command.init()
    log.info('called frontend:index')
    render (view: "index", model: [command: command, distances: distances])
}

不幸的是,每次调用我看到'called frontend:index'出现在日志中,一些基本的计时证实在调用期间速度没有增加。

我错过了一个技巧吗?我找不到解决办法,所以请帮助我,我将不胜感激。

我将包括命令对象,这应该对缓存有任何影响吗?

class IndexCommand {
    def searchService
    def eventCategoryService
    int max
    int offset
    String search
    java.util.Date queryStartDate = new Date()
    java.util.Date queryEndDate = new Date().plus(365)
    def sportCategories
    def results
    def benchmark = { closure ->
        def start = System.currentTimeMillis()
        closure.call()
        def now = System.currentTimeMillis()
        now - start
    }
    def init() {
        if (!max) max = 6
        if (!offset) offset = 0
        def duration = benchmark {
            results = searchService.advancedSearchWithPagedResults(
                    max,
                    offset,
                    search,
                    queryStartDate,
                    queryEndDate)
        }
        log.info("searchService.advancedSearchWithPagedResults took ${duration} ms" )
        duration = benchmark {
            sportCategories = eventCategoryService.findAllSports()
        }
        log.info("EventCategory.findAllByParentCategoryName took ${duration} ms" )
    }
}

你正在传递IndexCommand命令在你的行动,所以每次你调用的行动,你正在传递IndexCommand的不同对象。这些值被缓存,但是你必须传递相同的对象才能从缓存中获取值。

因此,您可以传递所需的对象字段,而不是传递整个对象,并在操作中创建对象。

希望对你有帮助。

谢谢

最新更新