在grails应用程序中自定义ehcache.xml后抛出异常

时间:2012-08-05 13:03:33

标签: exception grails configuration ehcache

为了在我的grails应用程序中个性化ehcache,我将以下xml添加到config目录中:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" >
<diskStore path="/path/to/store/data"/>
<cacheManagerEventListenerFactory class="" properties=""/>
<defaultCache
   maxEntriesLocalHeap="10000"
   eternal="false"
   timeToLiveSeconds="120">
   <persistence strategy="none"/>
</defaultCache>
<cache name="Book"
  maxEntriesLocalHeap="10000"
  timeToIdleSeconds="300"
   />
<cache name="org.hibernate.cache.UpdateTimestampsCache"
  maxEntriesLocalHeap="10000"
  timeToIdleSeconds="300"
   />
<cache name="org.hibernate.cache.StandardQueryCache"
  maxEntriesLocalHeap="10000"
  timeToIdleSeconds="300"
   />
</ehcache>

令我惊讶的是,启动时,grails应用停止,但例外情况为:

Caused by: net.sf.ehcache.CacheException: Error configuring from input stream. Initial  cause was null:9: Element <defaultCache> does not allow attribute "maxEntriesLocalHeap".
at    net.sf.ehcache.config.ConfigurationFactory.parseConfiguration(ConfigurationFactory.java:152)
at net.sf.ehcache.config.ConfigurationFactory.parseConfiguration(ConfigurationFactory.java:99)
... 30 more

任何提示?我正在使用grails 1.3.9;感谢。

5 个答案:

答案 0 :(得分:9)

Spring遇到同样的问题,maxEntriesLocalHeapmaxEntriesLocalDisk抛出相同的异常。似乎对我有用的是使用maxElementsInMemorymaxElementsOnDisk代替。从javadoc找到它们。

现在,基于它们被弃用,我假设有一个旧版本的EHCache继续使用我的conf以及你的。

基于this table,maxEntriesLocalHeap出现在EHCache 2.5上。在此之前它是maxElementsInMemory。当我遇到麻烦时,我使用了ehcache-spring-annotations,在撰写本文时,它是1.2.0版本,附带ehcache 2.4.5 - 因此不支持这些属性。

在寻求纯Spring配置和显式依赖EHCache 2.5之后,问题消失了,我能够使用我原本想要的属性。

答案 1 :(得分:3)

在最新版本的Ehcache(2.6.x)中添加了像'maxEntriesLocalHeapEhcache'这样的标签或者作为'persistence'的内部元素。

我会去: A)使用'maxElementsInMemory'(而不是'maxEntriesLocalHeap');使用'overflowToDisk'和'diskPersistent'属性(而不是'persistence'元素),... B)尝试获取最新版本的插件或手动将最新的jar添加到项目中。

答案 2 :(得分:0)

如果你使用Hibernate

4.3.5或4.3.7版本依赖于Ehcache 2.4.7,该版本没有maxEntriesLocalHeap和maxEntriesLocalDisk属性。

有关Ehcache 2.4.x的文档:http://ehcache.org/files/documentation/EhcacheUserGuide.pdf

我使用hibernate 4.3.5的例子:

<defaultCache maxElementsInMemory="10000"
              eternal="false"
              timeToIdleSeconds="300"
              timeToLiveSeconds="600"
              diskSpoolBufferSizeMB="30"
              maxElementsOnDisk="10000"
              diskExpiryThreadIntervalSeconds="120"
              memoryStoreEvictionPolicy="LRU" statistics="false">
</defaultCache>

<cache
        name="org.hibernate.cache.spi.UpdateTimestampsCache"
        maxElementsInMemory="10000"
        eternal="false">
</cache>

<cache
        name="org.hibernate.cache.internal.StandardQueryCache"
        maxElementsInMemory="10000"
        eternal="false"
        timeToLiveSeconds="300">
</cache>

<!--
If you are concerned about cpu utilisation and locking in the DiskStore, you can set the
diskExpiryThreadIntervalSeconds to a high number - say 1 day. Or you can effectively turn it off by
setting the diskExpiryThreadIntervalSeconds to a very large value
-->
<cache
        name="br.com.atlantico.toi.model.calc.Anomalia"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"/>

答案 3 :(得分:0)

正如eis所说,Hibernate-ehcache内部使用ehcache 2.4.3,但属性不支持该版本。您需要使用更高版本的ehcache。

这里只是尝试添加更详细的配置:

首先,将hibernate-ehcache和ehcache-core添加到maven pom。

var container = document.getElementById("container");

var cloneTool = document.querySelector("[data-tool='clone']");
cloneTool.onclick = function() {
    var elements = document.querySelectorAll("[data-test][data-cloneable]");
    Array.prototype.forEach.call(elements, function(element) {
        var clone = element.cloneNode(true);
        container.appendChild(clone);
    });
};

然后,在spring配置中设置会话工厂的属性。使用org.hibernate。中的类,而不是net.sf.ehcache中的类。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.5</version>
</dependency>

答案 4 :(得分:0)

我遇到了类似的问题,我通过使用以下罐子解决了这个问题。

  1. ehcache.2.9.jar
  2. logback-core-1.0.13.jar
  3. 的logback-经典1.0.13.jar
  4. 您在项目路径中添加以上jar ..它可以正常工作。