控制器操作缓存似乎无法使用 Grails 缓存插件
Controller action caching does not appear to work using Grails Cache 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"])
}
}
创建缓存后,我不再看到 'called EventCategoryService.findAllSports' 按预期出现在后续调用的日志中。
但是,插件在名为 'Controller action caching' 的部分中指出 'you can also cache responses for web requests using the same annotations'。
@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 对象。并且这些值被缓存但是你必须传递相同的对象才能从缓存中获取值。
因此,您可以传递对象的必填字段并在操作中创建对象,而不是传递整个对象。
希望对您有所帮助。
谢谢
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"])
}
}
创建缓存后,我不再看到 'called EventCategoryService.findAllSports' 按预期出现在后续调用的日志中。
但是,插件在名为 'Controller action caching' 的部分中指出 'you can also cache responses for web requests using the same annotations'。
@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 对象。并且这些值被缓存但是你必须传递相同的对象才能从缓存中获取值。
因此,您可以传递对象的必填字段并在操作中创建对象,而不是传递整个对象。
希望对您有所帮助。
谢谢