7

为了在我的 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;谢谢。

4

5 回答 5

9

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

现在,基于它们已被弃用,我假设我的 conf 和你的 conf 中都有旧版本的 EHCache。

根据这张表,maxEntriesLocalHeap 出现在 EHCache 2.5 上。在此之前它是 maxElementsInMemory。当我遇到麻烦时,我使用了ehcache-spring-annotations,在撰写本文时,它的版本为 1.2.0,随 ehcache 2.4.5 一起提供 - 因此不支持这些属性。

在进行纯 Spring 配置和对 EHCache 2.5 的显式依赖之后,问题消失了,我能够使用我最初打算使用的属性。

于 2012-10-03T13:30:51.110 回答
3

在最新版本的 Ehcache (2.6.x) 中添加了诸如“maxEntriesLocalHeapEhcache”之类的标签或诸如“持久性”之类的内部元素。

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

于 2012-10-16T10:41:47.500 回答
1

如果你使用休眠

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

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

我使用休眠 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"/>

于 2014-12-19T00:32:44.123 回答
0

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

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

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

<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>

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

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory </prop>
于 2015-05-20T03:15:37.053 回答
0

我遇到了类似的问题,我通过使用以下 jars 解决了。

  1. ehcache.2.9.jar
  2. logback-core-1.0.13.jar
  3. logback-classic-1.0.13.jar

您在项目路径中添加上面的 jars.. 它会正常工作。

于 2017-08-29T05:10:54.497 回答