2009-04-19 9 views
8

Ciao Ho incontrato alcuni problemi con la cache di secondo livello di ibernazione. Come provider di cache io uso ehcache.Hibernate cache di secondo livello

Parte della configurazione da persistence.xml

<property name="hibernate.cache.use_second_level_cache" value="true"/> 
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
<property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml" /> 

a configurare i miei soggetti che utilizzano le annotazioni in modo da:

@Cache(region = "Kierunek", usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Kierunek implements Serializable {

importazioni per tali annotazioni sono: import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy;

mia ehcache.xml

<diskStore path="java.io.tmpdir" /> 

<defaultCache maxElementsInMemory="10000" eternal="false" 
    timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" 
    diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" 
    diskPersistent="false" diskExpiryThreadIntervalSeconds="120" 
    memoryStoreEvictionPolicy="LRU" /> 

<cache name="Kierunek" maxElementsInMemory="1000" 
    eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LRU" /> 

E chiunque idea del perché ottengo l'errore seguente?

WARNING: Could not find a specific ehcache configuration for cache named [persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB.Kierunek]; using defaults. 
19:52:57,313 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB state=Create 
java.lang.IllegalArgumentException: Cache name cannot contain '/' characters. 

soluzione è quella di aggiungere un'altra proprietà al persistence.xml

<property name="hibernate.cache.region_prefix" value=""/> 

e che rimuove il prefisso difettoso grande thx Ruslan!

+1

È necessario specificare correttamente la parola "livello" anziché "lvl". È più leggibile e navigabile. –

+1

Hai ragione. Stavo scrivendo questo essere piuttosto frustrato, quindi non ci ho pensato ^^ grazie – Dogrizz

risposta

8

IMHO, ottieni il nome della regione generata per la tua classe. Questo nome generato "persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.pl.bdsdev.seps.encje.Kierunek". E non è definito nella tua configurazione ehcache.xml. Inoltre sta cercando il nome predefinito, quindi non può usare la regione di default.

Come opzione per risolvere questo problema è possibile utilizzare @Cache proprietà di annotazione di predefinire qualche nome della regione, come

@Cache(region = 'Kierunek', usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Kierunek implements Serializable { 
    // .... 
} 

E in ehcache.xml

<cache name="Kierunek" 
     maxElementsInMemory="1000" 
     eternal="true" 
     overflowToDisk="false" 
     memoryStoreEvictionPolicy="LRU" /> 
+0

sì, io ottengo il nome della regione generata (ora so che è regione, nell'articolo ho letto che è stato chiamato solo cache quindi mi sono confuso ..) e questa era la mia intenzione originale. Mi chiedo perché Hibernate generi un nome errato della regione. E ancora una volta se si ha una voce predefinita non è necessario specificare la regione per entità (se si sta bene con quello). Comunque sono grato per la risposta. Ha risolto il mio problema. Grazie! ^^ – Dogrizz

+1

Benvenuto. Ho controllato la documentazione. Hanno affermato che il nome della regione predefinita è un nome di classe completo. Questo è un grosso errore nella documentazione, dovrebbero risolverlo al più presto, perché non è chiaro in ogni caso. – ruslan

+0

ha funzionato per 2 deploymnets e ora ho: ATTENZIONE: Impossibile trovare una configurazione ehcache specifica per la cache denominata [persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.Kierunek]; usando i valori predefiniti. 19: 52: 57,313 ERRORE [AbstractKernelController] Errore nell'installazione di Start: name = persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB state = Crea java.lang.IllegalArgumentException: il nome della cache non può contenere caratteri '/' . Vede il nome della regione impostato nell'annotazione, ma aggiunge il prefisso di riserva. – Dogrizz

0

EHCache richiede una configurazione che indichi come memorizzare nella cache gli oggetti nell'applicazione (tempo di attività, tipo di cache, dimensione della cache, comportamento di memorizzazione nella cache ecc.). Per ogni classe che si tenta di memorizzare nella cache, cercherà di trovare una configurazione di cache appropriata e di stampare l'errore sopra se non riesce a farlo.

Vedere http://ehcache.sourceforge.net/documentation/configuration.html per come configurare EHCache.

+0

Ho una corretta configurazione di ehcache (e non hai bisogno di configare ogni entità in ehcache.xml se hai definito la cache "predefinita"). Il problema è perché Hibernate genera uno strano nome di cache? Dovrebbe essere pl.bdsdev.seps.encje.Kierunek ed è persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.pl.bdsdev.seps.encje.Kierunek – Dogrizz

5

Hibernate aggiungere il prefisso ai nomi di cache in base all'appname o al valore della proprietà hibernate.cache.region_prefix

Se si imposta questa proprietà per "" (stringa vuota), allora ci sono regioni denominate esattamente come nome nella configurazione di ibernazione.