Pregunta

Me pregunto si es posible que el caché de segundo nivel de Hibernate (estamos usando EHCache) permita que una aplicación almacene en caché una Entidad que ha sido enviada a la base de datos si sabe que ninguna otra aplicación está modificando la base de datos.

Mi idea es que si actualizo el registro A, entonces conozco el valor del registro A y debería poder almacenar en caché eso, los sistemas de agrupación en clúster JVM como Terracotta admiten este tipo de comportamiento en términos de memoria de almacenamiento dinámico JVM utilizando bloqueos de sincronización de Java.

configuración del modo de bloqueo EHCache en Hibernación

¿Fue útil?

Solución

El libro POJO's in Action de State of the art habla de ello

  

Si una aplicación de un solo servidor actualiza la base de datos utilizando el marco de persistencia, el marco actualiza la caché de nivel de proceso.

Y ...

  

Los objetos almacenados en caché que se pueden actualizar normalmente deben usar un bloqueo optimista porque eso evitará que la aplicación sobrescriba ciegamente los cambios en la base de datos. Y si una transacción actualiza un objeto almacenado en caché que ya se había modificado en la base de datos, el error de bloqueo optimista hará que la transacción se revierta. El marco de persistencia eliminará los datos obsoletos de la memoria caché y la aplicación puede volver a intentar la transacción con la última versión de los datos.

Y elija una de las siguientes estrategias según JPA con el libro Hibernate

  • Transaccional: disponible solo en un entorno administrado, garantiza total Aislamiento transaccional hasta lectura repetible, si es necesario. Usa esta estrategia para leer principalmente datos donde es crítico para evitar datos obsoletos en transacciones concurrentes, en el raro caso de una actualización.
  • Lectura-escritura: esta estrategia mantiene el aislamiento de lectura confirmada, usando una marca de tiempo Mecanismo y está disponible solo en entornos no agrupados. Nuevamente, use esta estrategia para leer datos en su mayoría donde sea crítico para evitar datos obsoletos en transacciones concurrentes, en el raro caso de una actualización.

Agregado a la respuesta original: Hibernate NO GARANTIZA la consistencia entre el caché y la base de datos si usa @Cache (use = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Si desea usarlo, DEBE configurar un tiempo de espera de expiración suficientemente corto que pueda afectar el rendimiento.

saludos,

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