2011-12-28 10 views
11

Estoy tratando de averiguar qué estrategia de simultaneidad de caché debo usar para mi aplicación (para actualizaciones de entidades, en particular). La aplicación es un servicio web desarrollado con Hibernate, se implementa en clúster Amazon EC2 y funciona en Tomcat, por lo que no hay servidor de aplicaciones allí.Hibernate L2 cache. ¿Estrategia de concurrencia de lectura/escritura o de caché transaccional en el clúster?

Sé que hay no estricta-lectura-escritura \ lectura-escritura y estrategias de concurrencia de caché de transacciones de datos que pueden ser actualizados y no son, listas para producción proveedores de caché 2L populares maduros para la hibernación: Infinispan, Ehcache, Hazelcast.

Pero no entiendo por completo la diferencia entre el transaccional y de lectura y escritura cachés de la documentación de Hibernate. Pensé que el caché transaccional es la única opción para una aplicación de clúster, pero ahora (después de leer algunos temas), no estoy tan seguro de eso.

Así que mi pregunta es acerca de la lectura-escritura caché. ¿Es seguro para clústeres? ¿Garantiza la sincronización de datos entre la base de datos y el caché, así como la sincronización entre todos los servidores conectados? ¿O solo es adecuado para aplicaciones de servidor único y siempre debería preferir la caché transaccional ?

Por ejemplo, si una transacción de base de datos que se actualiza un campo de entidad (nombre de pila, etc.) y no se ha deshecho, será la lectura y escritura caché descartar los cambios o se acaba de llenar los malos datos (el primer nombre actualizado) a todos los otros nodos? ¿Requiere una transacción JTA para esto?

El tema Concurrency strategy configuration for JBoss TreeCache as 2nd level Hibernate cache dice:

'READ_WRITE` es una combinación interesante. En este modo, Hibernate funciona como un XA-coordinador liviano, por lo que no requiere un XA externo completo . Breve descripción de cómo funciona:

  1. En este modo, Hibernate gestiona las transacciones en sí. Todas las acciones de DB deben estar dentro de una transacción, el modo de confirmación automática no funcionará.
  2. Durante el proceso de limpieza() (que puede aparecer varias veces durante la vida útil de la transacción , pero generalmente ocurre justo antes de la confirmación) Hibernate realiza una búsqueda y busca objetos actualizados/insertados/eliminados. Estos objetos se guardan primero en en la base de datos, y luego se bloquean y actualizan en la memoria caché para que las transacciones simultáneas no puedan ni actualizarlos ni leerlos.
  3. Si la transacción se retrotrae (explícitamente o debido a algún error ), los objetos bloqueados simplemente se liberan y desalojan del caché , para que otras transacciones puedan leerlos o actualizarlos.
  4. Si la transacción se realiza correctamente, los objetos bloqueados son que se han liberado y otros hilos pueden leerlos/escribirlos.

¿Hay alguna documentación sobre cómo funciona esto en un entorno de clúster?

Parece que la memoria caché transaccional funciona correctamente para esto, pero requiere entorno JTA con un administrador de transacciones independiente (como JBossTM, atomikos, Bitronix), el origen de datos XA y una gran cantidad de cambios de configuración y pruebas. Logré implementar esto, pero todavía tengo algunos problemas con mis frameworks. Por ejemplo, Google Guice IoC no admite transacciones JTA y tengo que reemplazarlo con Spring o mover el servicio a algún servidor de aplicaciones y usar EJB.

Entonces, ¿qué camino es mejor?

¡Gracias de antemano!

Respuesta

4

Hasta ahora solo he visto trabajar en clúster 2LC con modos de caché transaccional. Eso es precisamente lo que Infinispan hace, y de hecho, Infinispan hasta ahora se ha mantenido alejado de la implementación de los otros modos de concurrencia de caché. Para aligerar la carga transaccional, Infinispan se integra a través de sincronizaciones de transacciones con Hibernate en lugar de XA.

+0

¿Quiere decir que la estrategia de caché de lectura/escritura es segura para clústeres pero la mayoría de las veces se usa transaccional? –

+2

No. La lectura y escritura puede hacer que las cosas sean consistentes, pero debería tener algún tipo de método de 2PC u otro para garantizar la consistencia en un clúster. Depende de la implementación de 2LC. Infinispan elige omitir las transacciones de lectura y escritura, que se utilizan para abarcar todas las operaciones y actuar atómicamente alrededor del clúster. –

16

Resumen de las diferencias

  • no estricta R/W y R/W son ambas estrategias asíncronas, lo que significa que se actualizan después de que se complete la transacción.
  • Transactional es obviamente sincrónico y se actualiza dentro de la transacción.
  • Nonstrict R/w nunca bloquea una entidad, por lo que siempre existe la posibilidad de que sea una lectura sucia.
  • La lectura-escritura siempre bloquea una entidad de forma suave, por lo que cualquier acceso simultáneo a se envía a la base de datos. Sin embargo, hay una posibilidad remota de que R/w no produzca aislamiento de lectura repetible.

La mejor manera de entender las diferencias entre estas estrategias es ver cómo se comportan durante el transcurso de la inserción, actualización o operaciones de borrado.

Puede consultar mi publicación here que describe las diferencias en más detalle. No dude en comentar.

Cuestiones relacionadas