Pregunta Spring - Transaction Readonly


Solo quería sus opiniones de expertos sobre gestión de transacciones declarativas para Spring. He aquí mi arreglo:

  1. La capa DAO es simplemente antigua JDBC utilizando Spring JdbcTemplate (No Hibernate, etc.)
  2. La capa de servicio es POJO con transacciones declarativas de la siguiente manera: save*, readonly = false, rollback for Throwable

Las cosas funcionan bien con la configuración anterior. Sin embargo, cuando digo get*, readonly = true, Veo errores en mi archivo de registro que dicen Database connection cannot be marked as readonly. Esto sucede para todos los métodos get * en la capa de servicio.

Ahora mis preguntas son:

A. ¿Tengo que establecer get* como solo de leer? Toda mi get* los métodos son operaciones de lectura pura DB. No deseo ejecutarlos en ningún contexto de transacción. ¿Qué tan grave es el error anterior?

B. Cuando elimino el get* configuración, no veo los errores. Además, todo mi simple get* las operaciones se realizan sin transacciones. ¿Es este el camino a seguir?

C. ¿Por qué alguien querría tener métodos transaccionales donde readonly = true? ¿Hay algún significado práctico de esta configuración?

¡Gracias! Como siempre, ¡sus respuestas son muy apreciadas!


23
2018-04-01 18:57


origen


Respuestas:


Esta publicación dice que el comportamiento o el readOnly la bandera es dependiente del mecanismo de persistencia.

DO. Sí, cuando se usa hibernación, brinda beneficios de rendimiento configurando el modo de descarga en FLUSH_NEVER (como se describe en la publicación vinculada)

SEGUNDO. Sí, las llamadas JDBC no requieren una transacción (hibernate requiere una), por lo que se eliminan @Transactional la configuración recorta toda la gestión de transacciones.

A. Supongo que la primavera está llamando connection.setReadOnly(true) pero su controlador JDBC no es compatible con esto

El resultado final es: no usar readonly transacciones con JDBC simple.

Y otra cosa: se supone que las transacciones abarcan múltiple consultas. No haga sus transacciones demasiado detalladas. Hazlos una unidad de trabajo.


23
2018-04-01 19:11



A. ¿Tengo que decir get * como readonly? Todos mis métodos get * son operaciones de lectura pura DB. No deseo ejecutarlos en ningún contexto de transacción. ¿Qué tan grave es el error anterior?

En realidad, es probable que todavía desee ejecutar todos sus get()s en el contexto de una transacción, para asegurarse de que obtiene lecturas consistentes. Si, por otro lado, no te importa esto, puedes establecer el nivel de transacción en consecuencia.

C. ¿Por qué alguien querría tener métodos transaccionales donde readonly = true? ¿Hay algún significado práctico de esta configuración?

  1. Para ayudar a proteger contra escrituras errantes dentro de los métodos get () `
  2. Para fines de optimización. Hibernate no solo puede hacer uso de esta información, como lo mencionó Bozho, sino que algunas bases de datos / controladores JDBC también pueden hacer uso de esta información.

5
2018-04-01 19:54