Pregunta

Estoy usando JBoss 5.1.0 GA junto con Hibernate y ahora estoy tratando de habilitar la caché de segundo nivel. He añadido las siguientes propiedades a mi configuración de Hibernate.

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

Y he anotada entidades que espero que cambiar con frecuencia con lo siguiente:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

Esto se basa en mi comprensión de la documentación .

La aplicación despliega con éxito sin mensajes en busca de miedo (WARN o error por ejemplo, los mensajes de la secuencia de registro). Durante un corto período de tiempo que veo que el almacenamiento en caché de trabajo (estoy usando estadísticas de Hibernate para ver esto), pero después de un corto tiempo puedo obtener seguimientos de pila de la forma (incluso cuando inicia sesión como un usuario sin ningún tipo de acceso remoto):

  

"Transacción intentó crear   MICLASE nuevo. Que ya ha sido   creado desde esta transacción   comenzado, por otro (posiblemente a distancia)   transacción. Tenemos un concurrente   evento de creación "

Después de un seguimiento de la pila gigante que con el tiempo se remonta a una consulta con nombre que he hecho, que tiene la siguiente forma:

SELECT x FROM X WHERE x.deleted = false

La consulta con nombre no tiene anotaciones adicionales para el almacenamiento en caché.

Cualquier consejo sobre la manera de resolver este problema sería muy apreciada.

¿Fue útil?

Solución

Algunas preguntas primeros:

  1. ¿Es esta excepción se propaga a su aplicación? Quiero decir, ¿está afectado por este, o si sólo se preocupan por el mensaje en el registro?
  2. ¿Están todas sus entidades anotadas con la estrategia transaccional, o sólo algunos de ellos?
  3. ¿Su consulta recupera ansiosamente objetos inverosímiles de otra clase?

Yo diría que lo mejor que podría hacer ahora es permitir depuración (o tal vez incluso TRACE) el registro para las operaciones de caché: log4j.logger.org.hibernate.cache=debug Esto le dirá exactamente lo que está haciendo Hibernate. I sospechoso que Hibernate está tratando de poner un objeto en la memoria caché, y haciendo de nuevo una vez que se ve el mismo objeto durante la misma sesión (tal vez como parte del árbol de otro objeto). Hubo un problema de marca de tiempo para la caché de consultas hace algún tiempo, y el mismo problema podría estar ocurriendo aquí. Por ejemplo:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

Pero, de nuevo, que es un poco difícil de predecir cuál es la solución sin saber cuál sería el problema. Y me temo que sólo registro de Hibernate le puede decir lo que es realmente el problema.

PS:. Este estaba destinado a ser publicado como un comentario, pero esto era demasiado larga para él

Otros consejos

¿Usted ha intentado CacheConcurrencyStrategy.NONSTRICT_READ_WRITE? He leído los documentos muchas veces y no sé exactamente qué elegir, pero parece que funcionan bien para mis proyectos. Creo que la CacheConcurrencyStrategy.TRANSACTIONAL es demasiado seguro y evitar la actuación de caché en ciertas circunstancias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top