Caching grails应用程序中的grails缓存ehcache插件,用于使用@Cacheable注释进行缓存

Caching grails应用程序中的grails缓存ehcache插件,用于使用@Cacheable注释进行缓存,caching,grails,groovy,ehcache,grails-cache,Caching,Grails,Groovy,Ehcache,Grails Cache,我的情况是,我有Grails2.1.2应用程序,并希望引入方法级缓存,使用和作为实现 我的缓存配置为在内存中,如下所示: grails.cache.config = { cache { name 'homePageCache' enabled true eternal false pinning { store 'localMemory' } } 我有一个这样的方法,它只接受int参

我的情况是,我有Grails2.1.2应用程序,并希望引入方法级缓存,使用和作为实现

我的缓存配置为在内存中,如下所示:

  grails.cache.config = {
    cache {
        name 'homePageCache'
        enabled true
        eternal false
        pinning {
            store 'localMemory'
    }
  }
我有一个这样的方法,它只接受int参数,所以密钥生成不是问题:

  @Cacheable('homePageCache')
  TubeVideoPagingArray findHomePageOfVideos(int pageSize) {
我的问题是,当调用此方法时,我得到了一个
java.lang.OutOfMemoryError:java堆空间
异常。原因是ehcache使用名为ObjectGraphWalker的类计算要放入缓存的对象的大小,该类遍历对象图并求和大小

我已经为ehcache设置了调试级日志记录,并看到大量类似于以下内容的行:

2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'bigDecimalMultiplier' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'digitList' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'positivePrefixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'positiveSuffixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'negativePrefixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'negativeSuffixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'currency' of class java.text.DecimalFormatSymbols
2014-04-17 13:27:13,488 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.converters.codecs.XMLCodec$__clinit__closure1
2014-04-17 13:27:13,491 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.URLCodec$__clinit__closure2
2014-04-17 13:27:13,492 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.URLCodec$__clinit__closure1
2014-04-17 13:27:13,494 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.SHA256Codec$__clinit__closure2
2014-04-17 13:27:13,495 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.SHA256Codec$__clinit__closure1
2014-04-17 13:27:13,498 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.JavaScriptCodec$__clinit__closure1
2014-04-17 13:27:13,501 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.MD5BytesCodec$__clinit__closure2
很明显,它遍历了一堆元类,这些元类将它引向其他元类,最终以上帝知道的地方结束

Ehcache有一种机制来配置此处所述的计算大小:

最近我发现,自2.8版(我使用2.8.1)以来,此配置也有一个编程API,您可以使用此库进行设置:

这里提到了一个解决元类遍历的方法。我已经试过了,但它不起作用-它的核心是这个过滤器:

public void configure(final Filter filter) {
    filter.ignoreInstancesOf(groovy.lang.MetaClass.class, false);
}
我认为问题在于groovy对象中的元类字段不是元类的实例——它在日志中也是可见的

因此,在这么长的描述之后,我要提出一个问题:

是否有人遇到同样的问题并以某种方式解决了它?

如果您使用它,应该可以解决您的问题


但不幸的是,它不在Maven Central中,因此您需要构建并发布它您的

是否成功地使用了它?在我的问题中,我提到我使用了这个引擎,但它不适合我。它没有解决元类遍历问题。。