Estoy trabajando en un entorno Spring, Java, Hibernate, Postgresql. Estoy viendo una lentitud bastante severa en mi base de datos. Mi pregunta específica es qué tan malo es si estoy agregando la anotación @Transactional de Spring a una clase que contiene métodos que no llegan a la base de datos. En otras palabras, no requieren una transacción. Suponga que estos métodos son algunos de los más utilizados.
Así que algo como esto (sólo un ejemplo):
@Component @Transactional public class ProjectManager { public String getProjectUrl(Project project) { //simple logic that does not use the database return "/my/url/" + project.getId(); } } Entiendo que hay muchos factores que pueden causar la lentitud de la base de datos. Me pregunto si esto es una gran bandera roja o no es tan importante. ¿Debería sacar estos métodos y ponerlos en una clase diferente que no esté marcada con @Transactional ?
AIT
En primer lugar, su método getProjectUrl será interceptado con un aspecto primaveral, que:
Esto está bien descrito en Spring Docs . Además, Spring no es lo suficientemente inteligente como para comprender que el código del método no usa DB en absoluto ( como vemos en la fuente ).
Entonces, definitivamente podemos concluir que @Transactional de Spring causa algunos gastos generales .
Pero, ¿qué tipo de gastos generales?
propagation de @Transactional , es posible que nos veamos obligados a crear una transacción física (DB). Esto provoca red + conexión + sobrecarga del lado de la base de datos. Por otro lado, si elimina @Transactional , también debe saber que Postgres envuelve CUALQUIER consulta SQL no transaccional en transacción implícita ( docs ):
PostgreSQL en realidad trata cada instrucción SQL como ejecutada dentro de una transacción. Si no emite un comando BEGIN, entonces cada declaración individual tiene un BEGIN implícito y (si tiene éxito) COMMIT envuelto alrededor.
Finalmente, la respuesta: no use @Transactional si su método no trata con DB.