2012-08-05 10 views
5

W moim dążeniu do personalizacji ehcache w moim grails aplikacji, dodałem następujące xml do katalogu config:Wyjątek rzucony po dostosowaniu ehcache.xml w aplikacji grails

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

Ku mojemu zaskoczeniu, gdy uruchomiony, Grails aplikacja zatrzymuje się z wyjątkiem:

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 

Jakieś wskazówki? Używam grails 1.3.9; dzięki.

Odpowiedz

8

Mam ten sam problem z wiosną, maxEntriesLocalHeap i maxEntriesLocalDisk rzucił ten sam wyjątek. To, co wydawało się działać, to zamiast tego używać maxElementsInMemory i maxElementsOnDisk. Znaleziono je od javadoc.

Teraz, na podstawie tego, że są przestarzałe, zakładam, że istniała starsza wersja EHCache z moim conf, tak samo jak twoja.

Na podstawie this table, maxEntriesLocalHeap pojawił się na EHCache 2.5. Wcześniej było to maxElementsInMemory. Kiedy miałem problemy, użyłem ehcache-spring-annotations, i od tego pisania jest to w wersji 1.2.0, przychodzące z ehcache 2.4.5 - a więc nie obsługujące tych właściwości.

Po przejściu do czystej konfiguracji Spring i jawnej zależności od EHCache 2.5, problem zniknął i mogłem użyć właściwości, które pierwotnie zamierzałem.

3

Znaczniki takie jak "maxEntriesLocalHeapEhcache" lub elementy wewnętrzne jako "trwałość" zostały dodane w najnowszej wersji Ehcache (2.6.x).

Wybrałbym: A) Użyj "maxElementsInMemory" (zamiast "maxEntriesLocalHeap"); użyj atrybutów "overflowToDisk" i "diskPersistent" (zamiast elementu "persistence"), ... B) Spróbuj uzyskać najnowszą wersję wtyczki lub ręcznie dodaj nowe słoiki do projektu.

+0

Aby porównać stare właściwości z elementem "trwałość", zobacz: http://www.ehcache.org/documentation/2.8/configuration/fast-restart.html#compatibility-with-previous-versions –

0

Jeśli w użyciu Hibernate

wersji 4.3.5 lub 4.3.7 posiada zależność ehcache że wersja 2.4.7 nie mają właściwości maxEntriesLocalHeap i maxEntriesLocalDisk.

Dokumentacja o ehcache 2.4.x: http://ehcache.org/files/documentation/EhcacheUserGuide.pdf

Mój przykład przy użyciu hibernacji 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"/> 

0

Tak jak powiedział eis, Hibernate-ehcache wewnętrznie używać ehcache 2.4.3, ale atrybut nie obsługuje tej wersji. Musisz użyć wyższej wersji ehcache.

Tutaj po prostu spróbować dodać bardziej szczegółowe konfiguracje:

Po pierwsze, dodać obie hibernacji-ehcache i ehcache-core do 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> 

Następnie ustaw właściwość dla fabryki sesji w konfiguracji sprężyny. Użyj klas z org.hibernate. , zamiast z net.sf.ehcache.

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory </prop> 
0

Podejrzewam podobny problem i rozwiązałem go, używając następujących słoików.

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

dodasz powyżej słoików w ścieżce projektu. działa dobrze.

+0

edytuj swoje trochę odpowiedzieć –

Powiązane problemy