Tengo una aplicación que utiliza JPA, Hibernate y ehcache, así como las transacciones declarativas de de Spring. La carga en DB es bastante alta, por lo que todo se almacena en caché para acelerar las cosas, incluidas las colecciones. Ahora no es un secreto que las colecciones se almacenan en caché por separado de las entidades que las poseen, así que si elimino una entidad que es un elemento de dicha colección en caché , persisto una entidad que debe ser un elemento de uno, o actualizo una entidad de modo que viaja de una colección a otra, debo realizar el desalojo a mano.Hibernate/Ehcache: colecciones de desalojo de la memoria caché de segundo nivel no sincronizadas con otras lecturas DB
lo que el uso de un detector de eventos de hibernación, que mantiene un registro de las entidades que se inserta, eliminados o actualizados y guarda esa información para una sincronización de operación registrada con el gestor de transacciones de primavera a actuar. La sincronización realiza el desalojo una vez que se ha confirmado la transacción .
Ahora el problema es que muy a menudo, alguna otra transacción simultánea logra encontrar una colección en la memoria caché que acaba de ser desalojado (estos eventos son por lo general décimas de segundo separados de acuerdo con log) y, naturalmente, , hace que ocurra una EntityNotFoundException.
¿Cómo sincronizo esto correctamente?
He intentado hacer el desalojo en cada uno de los 4 métodos de TransactionSynchronization (que se invocan en diferentes puntos en el tiempo en relación con la finalización de la transacción), no ayudó.
Se desalojó fuera de una transacción, por cierto. Y tengo que buscar la API para marcarlos sucios, gracias.Además, ¿cómo puedo sincronizar Hibernate en ese bloqueo que sugirió agregar? –
Aparentemente, el indicador sucio de PersistentCollection no funcionará, porque transacciones diferentes obtienen instancias diferentes de la misma colección . En cuanto a las cerraduras, voy a analizar eso a continuación, y realmente agradecería que alguien me indicara cuál es la API correcta. EhCache no es compatible con el bloqueo por lo que sé, miró eso lo primero. –