2012-03-30 16 views
6

Tengo algunas tablas para las que no tengo ninguna razón para actualizar desde la aplicación, por lo que me gustaría evitar que suceda incluso accidentalmente por un error en otro lugar.¿Es posible tratar una tabla como solo lectura en hibernación?

Veo la anotación @Immutable, pero parece que todavía permitirá las inserciones y eliminaciones. Me gustaría tratar a fondo toda la mesa (no solo cada entidad) como está escrita en piedra. ¿Hay una manera fácil de lograr esto? ¿O entiendo mal la documentación en @Immutable?

Si se necesita un ejemplo, digamos que hay una mesa con MONTH mesa, y una entidad Month, y una mesa de APPOINTMENT con una entidad asociada Appointment. Nunca me gustaría eliminar o insertar una fila en el mes.

Respuesta

3

has necesitado leer única estrategia de almacenamiento en caché:

Si su aplicación necesita leer, pero no modificar , las instancias de una clase persistente, una memoria caché de sólo lectura se pueden utilizar. Esta es la estrategia de ejecución más simple y óptima. Incluso es seguro para usar en un clúster.

Desde: 19.2.2. Strategy: read only

+0

Gracias por la respuesta. Creo que esto es lo que necesito. De la documentación, parece que esto al menos se ocupará de la optimización desde el punto de vista del rendimiento. No he tenido tiempo de verificar por mí mismo si esto es lo principal que deseo, que es _prevenir_ la aplicación de intentar guardar/actualizar/eliminar. Cuando tenga la oportunidad de verificarlo, aceptaré una respuesta o publicaré un comentario. – derekv

1

Una forma es usar READ_ONLY transacciones poniendo @Transactional(readOnly=true) sobre el método.

http://www.codeinstructions.com/2009/04/read-only-transactions-with-spring-and.html.

Otro método: en lo que respecta a los niveles de aislamiento, si la tabla nunca se inserta o se actualiza, puede usar el nivel de aislamiento READ_UNCOMMITTED, que permite lecturas sucias, lecturas no repetibles y lecturas fantasmas. Sin embargo, nada de eso importa ya que los datos nunca cambian.

Usted puede mirar en los diferentes niveles de aislamiento y los efectos de cada uno de los javadocs resorte (http://docs.huihoo.com/javadoc/spring/2.5/org/springframework/transaction/annotation/Isolation.html)

Esto va a liberar bloqueos en las filas de la mayoría y le dará el mejor rendimiento, al menos por lo que el bloqueo va

+0

Lo nivel de aislamiento parece ayudar ayudará con el rendimiento, gracias por permitirme conocer al respecto. Pero, ¿realmente evitará las lecturas/guardar/actualizaciones? The Transactional (readOnly = true) también es bueno saberlo, creo que en algunos casos esto podría ser perfecto. Si pudieras configurarlo para una entidad completa, sería perfecto. – derekv

+0

No estoy seguro pero no lo creo. Permitirá inserciones pero es rápido ya que no se emite ningún bloqueo. Para manejar inserciones use la opción readOnly = true. Arrojará una excepción al insertar. Confirmaré si la respuesta correcta es lo contrario. – instanceOfObject

Cuestiones relacionadas