2009-04-19 14 views
8

Hola, he tenido algunos problemas con la memoria caché de segundo nivel hibernate. Como proveedor de caché, uso ehcache.Hibernate caché de segundo nivel

Parte de configuración de 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" /> 

puedo configurar mis entidades que utilizan anotaciones de modo:

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

importaciones de esas anotaciones son: import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy;

mi 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" /> 

y la idea nadie por qué me sale error de seguimiento?

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. 

solución es añadir otra propiedad a persistence.xml

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

y que elimina el prefijo defectuosa ruslan gran THX!

+1

Debe deletrear completamente la palabra "nivel" en lugar de "lvl". Es más legible y navegable. –

+1

Tienes razón. Estaba escribiendo esto siendo bastante frustrado, así que no pensé en ello ^^ gracias – Dogrizz

Respuesta

8

En mi humilde opinión, obtiene el nombre de la región generada para su clase. Este nombre generó "persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.pl.bdsdev.seps.encje.Kierunek". Y no está definido en la configuración ehcache.xml de tu. También busca el nombre predefinido, por lo que no puede usar la región predeterminada.

Como una opción para resolver este problema, puede utilizar las propiedades de anotación @Cache predefinir algunos nombre de la región, como

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

Y en ehcache.xml

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

sí, obtengo el nombre de región generado (ahora sé que es región, en el artículo que he leído, simplemente se llamaba caché, así que me confundí ...) y esa era mi intención original. Me pregunto por qué Hibernate genera un nombre de región defectuoso. Y una vez más, si tiene una entrada predeterminada, no necesita especificar la región por entidad (si está de acuerdo con eso). De todos modos, estoy agradecido por la respuesta. Solucionó mi problema. ¡Gracias! ^^ – Dogrizz

+1

Bienvenido. He revisado la documentación. Dijeron que el nombre de región predeterminado es un nombre de clase completamente calificado. Este es un gran error en la documentación, deberían arreglarlo lo antes posible, ya que no está claro en ningún caso. – ruslan

+0

funcionó para 2 deploymnets y ahora aparece: ADVERTENCIA: No se pudo encontrar una configuración específica de ehcache para la memoria caché denominada [persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.Kierunek]; usando los valores predeterminados. 19: 52: 57,313 ERROR [AbstractKernelController] Error al instalar a Start: name = persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB state = Create java.lang.IllegalArgumentException: El nombre de la memoria caché no puede contener '/' caracteres . Se ve el nombre de la región establecido en la anotación, pero agrega ese prefijo de reserva .. – Dogrizz

0

EHCache necesita una configuración que le diga cómo almacenar en caché los objetos en su aplicación (tiempo en vivo, tipo de caché, tamaño de caché, comportamiento de almacenamiento en caché, etc.). Para cada clase que intente almacenar en caché, intentará encontrar una configuración de caché adecuada e imprimirá el error anterior si no lo hace.

Consulte http://ehcache.sourceforge.net/documentation/configuration.html para saber cómo configurar EHCache.

+0

Tengo la configuración adecuada de ehcache (y no es necesario configurar también cada entidad en ehcache.xml si tiene definida la caché "predeterminada"). El problema es ¿por qué hibernate genera ese extraño nombre de caché? Debe ser pl.bdsdev.seps.encje.Kierunek y es persistence.unit: unitName = pz2EAR.ear/pz2EJB.jar # pz2EJB.pl.bdsdev.seps.encje.Kierunek – Dogrizz

5

Hibernate agregar el prefijo a los nombres de caché en función del nombre de la aplicación o el valor de la propiedad hibernate.cache.region_prefix

Si establece esta propiedad para "" (cadena vacía), entonces tiene regiones llamadas exactamente igual nombre en la configuración de hibernación

Cuestiones relacionadas