2012-08-05 12 views
5

Nella mia ricerca per personalizzare EHCache nel mio graal app, ho aggiunto il seguente codice XML alla directory di configurazione:Eccezione generata dopo la personalizzazione ehcache.xml in applicazione graal

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

Con mia sorpresa, quando ha iniziato, i graal l'app si ferma con l'eccezione:

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 

Eventuali suggerimenti? Sto usando Grails 1.3.9; Grazie.

risposta

8

Lo stesso problema con Spring, maxEntriesLocalHeap e maxEntriesLocalDisk ha generato la stessa eccezione. Quello che sembrava funzionare per me era usare maxElementsInMemory e maxElementsOnDisk. Li ho trovati da javadoc.

Ora, a causa della loro deprecazione, presumo ci fosse una versione precedente di EHCache in corso con il mio conf, così come il tuo.

Sulla base di this table, maxEntriesLocalHeap è arrivato su EHCache 2.5. Prima che fosse maxElementsInMemory. Quando ho avuto problemi, avevo usato ehcache-spring-annotations e, al momento della stesura di questo, è in versione 1.2.0, che viene fornito con ehcache 2.4.5, quindi non supporta queste proprietà.

Dopo aver utilizzato la pura configurazione di Spring e la dipendenza esplicita da EHCache 2.5, il problema si è risolto e sono stato in grado di utilizzare le proprietà inizialmente previste.

3

Tag come "maxEntriesLocalHeapEhcache" o elementi interni come "persistenza" sono stati aggiunti nella versione più recente di Ehcache (2.6.x).

Mi piacerebbe andare: A) Utilizzare "maxElementsInMemory" (anziché "maxEntriesLocalHeap"); usa gli attributi 'overflowToDisk' e 'diskPersistent' (invece dell'elemento 'persistence'), ... B) Prova ad ottenere l'ultima versione del plugin o aggiungi gli ultimi jar manualmente al tuo progetto.

+0

Per confrontare le vecchie proprietà con l'elemento 'persistence', consultare: http://www.ehcache.org/documentation/2.8/configuration/fast-restart.html#compatibility-with-previous-versions –

0

Se l'utilizzo di Hibernate

Le versioni 4.3.5 o 4.3.7 hanno una dipendenza di EHCache 2.4.7 che la versione non hanno le proprietà maxEntriesLocalHeap e maxEntriesLocalDisk.

Documentazione su EHCache 2.4.x: http://ehcache.org/files/documentation/EhcacheUserGuide.pdf

Il mio esempio usando 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"/> 

0

proprio come ha detto eis, Hibernate-EHCache utilizzare internamente ehcache 2.4.3, ma l'attributo non supporta tale verion. Devi usare una versione più alta di ehcache.

qui solo cercare di aggiungere configurazioni più dettagliate:

primo luogo, aggiungere due hibernate-EHCache e EHCache-core a 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> 

Quindi, impostare la proprietà per la produzione di sessione nella configurazione di primavera. Utilizza le classi da org.hibernate. , anziché da net.sf.ehcache.

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

ho affrontato il problema simile e ho risolto utilizzando i seguenti barattoli.

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

si aggiunge sopra vasetti nel percorso del progetto. funzionerà bene

+0

si prega di modificare il tuo rispondi un po ' –

Problemi correlati