Tengo un sitio web con mucho tráfico y uso hibernate. También uso ehcache para almacenar en caché algunas entidades y consultas que son necesarias para generar las páginas.Evitar múltiples repoblaciones de la misma región de caché (debido a la concurrencia)
El problema es "caché paralela falla" y la explicación larga es que cuando la aplicación se inicia y las regiones de caché están frías, cada región de caché se llena muchas veces (en lugar de solo una) por diferentes subprocesos porque el sitio está golpeado por muchos usuarios al mismo tiempo. Además, cuando alguna región de caché invalida, se está repoblando muchas veces por el mismo motivo. ¿Cómo puedo evitar esto?
Logré convert 1 entity and 1 query cache to a BlockingCache proporcionando mi propia implementación a hibernate.cache.provider_class, pero la semántica de BlockingCache no parece funcionar. Lo que es peor, a veces bloquea los bloqueos de BlockingCache (bloques) y la aplicación se cuelga por completo. El volcado de subprocesos muestra que el procesamiento está bloqueado en el mutex de BlockingCache en una operación de obtención.
Entonces, la pregunta es, ¿Hibernate admite este tipo de uso?
Y si no, ¿cómo resuelves este problema en la producción?
Editar: El hibernate.cache.provider_class puntos a mi proveedor de caché a medida que es una pasta de copia de SingletonEhCacheProvider y al final del método start() (después de la línea 136) que hago:
Ehcache cache = manager.getEhcache("foo");
if (!(cache instanceof BlockingCache)) {
manager.replaceCacheWithDecoratedCache(cache, new BlockingCache(cache));
}
De esta manera, al inicializar, y antes de que nadie toque el caché llamado "foo", lo decoraré con BlockingCache. "foo" es un caché de consulta y "bar" (mismo código pero omitido) es un caché de entidad para un pojo.
Editar 2: "No parece que trabajar" significa que todavía existe el problema inicial. La memoria caché "foo" todavía se está rellenando muchas veces con los mismos datos, debido a la concurrencia. Valoro esto al enfatizar el sitio con JMeter con 10 hilos. Esperaría que los 9 hilos se bloquearan hasta que el primero solicitara datos de "foo" para finalizar su trabajo (ejecutar consultas, almacenar datos en el caché) y luego obtener los datos directamente del caché.
Datos 3: Otra explicación para este problema se puede ver en https://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0 pero con una respuesta definitiva.
Un desarrollo interesante que puede ayudar a mitigar este problema es que ehcache ahora (desde 2.1) admite la estrategia de concurrencia de caché transaccional para hibernar: http://stackoverflow.com/questions/3472613/does-ehcache-2-1-support -the-transactional-cache-concurrency-strategy-in-hibernat/3474011 # 3474011 – cherouvim