grails 2.4.2 ehcache插件1.0.5过早驱逐密钥

时间:2017-03-13 20:24:28

标签: caching grails ehcache

使用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 ]

分析

  1. 在第一个请求where site = 229,没有缓存任何内容。预期

  2. 在第二个请求where site = 229上,高速缓存229上输入的条目。预期

  3. 在第一个请求where site = 282上,键入229的条目被缓存,但是282上的条目未被缓存。预期

  4. 在第二个请求where site = 282上,键入282的条目被缓存,但是229上键入的条目不再被缓存。 UNEXPECTED - 预计两个密钥都被缓存。

  5. 在site = 229的第三个请求上,仍然缓存了282上键入的条目,但是没有缓存229上键入的条目。意外 - 期望两个密钥都被缓存(随后,282被驱逐,而229被放置,这与观察到的行为相匹配)

  6. 我做错了什么?谢谢你的帮助。

2 个答案:

答案 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声明添加等号的建议修复不正确。

相关问题