使用Grails缓存插件,控制器操作缓存似乎不起作用

时间:2016-08-29 11:19:37

标签: grails grails-plugin

Grails版本:3.0.9

Groovy版本: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"])
    }
}

创建缓存后,我不再按预期在后续调用的日志中看到“调用EventCategoryService.findAllSports”。

但是,该插件在名为“Controller action caching”的部分中声明“您还可以使用相同的注释缓存对Web请求的响应”。

@Cacheable('eventCategory')
def index(IndexCommand command) {

    command.init()

    log.info('called frontend:index')

    render (view: "index", model: [command: command, distances: distances])
}

不幸的是,我看到的每个电话'叫做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" )
    }
}

1 个答案:

答案 0 :(得分:1)

您正在操作中传递IndexCommand命令,因此每次调用操作时,您都会传递IndexCommand的不同对象。并且值被缓存但您必须传递相同的对象才能从缓存中获取值。

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

希望这有帮助。

由于