使用grails 2.4.2,cache:1.1.8和cache-ehcache:1.0.5,我发现缓存只保存一个条目。一旦添加第二个条目,第一个条目就会消失。
配置
BuildConfig.groovy:
compile ":cache:1.1.8"
compile ":cache-ehcache:1.0.5"
Config.groovy中:
grails.hibernate.cache.queries = true
grails {
cache {
order = 2000
enabled = true
clearAtStartup = true
shared = true
ehcache {
reloadable = false
}
}
}
grails.cache.clearAtStartup = true
grails.cache.config = {
cache {
name 'siteSettings'
}
provider {
updateCheck false
monitoring 'on'
dynamicConfig false
}
defaultCache {
maxElementsInMemory 10000
timeToIdleSeconds 600
timeToLiveSeconds 600
overflowToDisk false
diskPersistent false
memoryStoreEvictionPolicy 'LRU'
}
defaults {
maxElementsInMemory 10000
timeToIdleSeconds 600
timeToLiveSeconds 600
overflowToDisk false
diskPersistent false
memoryStoreEvictionPolicy 'LRU'
}
}
SettingsService.groovy中的缓存方法:
@Cacheable(value='siteSettings')
public JSONElement getSiteSettings(Integer site){
log.info "NOT CACHED for this request (${site})"
记录输出
1)首先请求site = 229(没有缓存):
Initialised cache: siteSettings
CacheDecoratorFactory not configured for defaultCache. Skipping for 'siteSettings'.
siteSettings size: 0
cacheKeys: 0
NOT CACHED for this request (229)
put at siteSettings: [ key = grails.plugin.cache.CustomCacheKeyGenerator$CacheKey@490f0efa, value={"test":229}, version=1, hitCount=3, CreationTime = 1489534645017, LastAccessTime = 1489534976819 ]
2)第二个请求,其中site = 229(缓存保存229):
siteSettings size: 1
cacheKeys: 1
key 229: [test:229]
3)首先请求site = 282(缓存保存229):
siteSettings size: 1
cacheKeys: 1
key 229: [test:229]
NOT CACHED for this request (282)
evicted from siteSettings: [ key = grails.plugin.cache.CustomCacheKeyGenerator$CacheKey@490f0efa, value={"test":229}, version=1, hitCount=3, CreationTime = 1489534645017, LastAccessTime = 1489534976819 ]
put at siteSettings: [ key = grails.plugin.cache.CustomCacheKeyGenerator$CacheKey@492726a5, value={"test":282}, version=1, hitCount=0, CreationTime = 1489534976848, LastAccessTime = 1489534976848 ]
4)第二个请求,其中site = 282(缓存保存282,而不是229):
siteSettings size: 1
cacheKeys: 1
key 282: [test:282]
5)第三个请求,其中site = 229(缓存保存282,而不是229):
siteSettings size: 1
cacheKeys: 1
key 282: [test:282]
NOT CACHED for this request (229)
evicted from siteSettings: [ key = grails.plugin.cache.CustomCacheKeyGenerator$CacheKey@492726a5, value={"test":282}, version=1, hitCount=3, CreationTime = 1489534976848, LastAccessTime = 1489535172110 ]
put at siteSettings: [ key = grails.plugin.cache.CustomCacheKeyGenerator$CacheKey@490f0efa, value={"test":229}, version=1, hitCount=0, CreationTime = 1489535172193, LastAccessTime = 1489535172193 ]
分析
在第一个请求where site = 229,没有缓存任何内容。预期
在第二个请求where site = 229上,高速缓存229上输入的条目。预期
在第一个请求where site = 282上,键入229的条目被缓存,但是282上的条目未被缓存。预期
在第二个请求where site = 282上,键入282的条目被缓存,但是229上键入的条目不再被缓存。 UNEXPECTED - 预计两个密钥都被缓存。
在site = 229的第三个请求上,仍然缓存了282上键入的条目,但是没有缓存229上键入的条目。意外 - 期望两个密钥都被缓存(随后,282被驱逐,而229被放置,这与观察到的行为相匹配)
我做错了什么?谢谢你的帮助。
答案 0 :(得分:1)
我怀疑,配置有问题。为了让grails.plugin.cache.ConfigLoader能够识别出Config.groovy中的grails.cache声明是一个Closure,必须有一个等号(=),如下所示:
Config.groovy中:
// wrong
grails {
cache {
order = 2000
enabled = true
clearAtStartup = true
shared = true
ehcache {
reloadable = false
}
}
}
// right
grails {
cache = {
order = 2000
enabled = true
clearAtStartup = true
shared = true
ehcache {
reloadable = false
}
}
}
不幸的是,这并没有反映在http://grails-plugins.github.io/grails-cache-ehcache/guide/usage.html的文档中,它显示了没有等号的配置元素的示例。
在将此日志记录输出出现后,将grails.plugin.cache日志级别设置为' debug'后,我发现了这一点:
DEBUG ehcache.EhcacheConfigLoader - Not including configs from Config.groovy
检查EhcacheConfigLoader的源代码显示当cache.config设置不是Closure时会出现此错误消息。在配置中添加等号使它成为一个闭包,现在加载了Config.groovy的缓存配置,这似乎解决了这个问题。
答案 1 :(得分:0)
我很遗憾地说,但整个帖子都是基于一个错误。通过从grails外部config .properties文件中删除一行来修复底层问题,该文件似乎已在Config.groovy中屏蔽了grails.cache.config的正确定义。外部配置是:
grails.cache.config.defaultCache.diskStore='java.io.tmpdir'
向grails.cache声明添加等号的建议修复不正确。