En este artículo, veremos cómo podemos usar LazyConnectionDataSourceProxy con Spring Data JPA para adquirir la conexión a la base de datos lo más tarde posible y, por lo tanto, reducir el tiempo de respuesta de la transacción.

Gestión de conexión de la capa de servicio

Supongamos que tenemos el método de servicio getAsCurrency:

Debido a que el método de servicio getAsCurrency está anotado con la anotación @Transactional(readOnly = true), Spring adquirirá la conexión a la base de datos, como se ilustra en el siguiente diagrama de secuencia:

De manera predeterminada, al iniciar una JPA EntityTransaction, Spring HibernateJpaDialect desea cambiar la conexión a la base de datos subyacente al modo de solo lectura. Sin embargo, para lograr este objetivo, primero debe adquirir la conexión JDBC y, una vez que se adquiere una conexión en una transacción RESOURCE_LOCAL, solo se puede liberar después de que se confirme o revierta la transacción actual.

La desventaja de obtener así la conexión a la base de datos

En nuestro ejemplo, lo primero que hace el método de servicio getAsCurrency es obtener los valores de moneda actuales de FxRate:

Y al llamar al método de servicio getAsCurrency, obtenemos la siguiente salida de registro:

Llamar a un servicio web externo lleva tiempo, y nuestro servicio de cambio de divisas no es diferente. Sin embargo, dado que la conexión a la base de datos se adquiere con entusiasmo, significa que la conexión se mantiene mientras se llama al servicio externo, lo que significa que, durante casi 750 milisegundos, privamos a otras transacciones concurrentes de usar la conexión a la base de datos subyacente. Lo ideal es que la conexión a la base de datos se adquiera a petición antes de ejecutar la primera declaración SQL, como la consulta SELECT que obtiene la entidad Producto en nuestro ejemplo.

Uso de LazyConnectionDataSourceProxy con Spring Data JPA

LazyConnectionDataSourceProxy está disponible desde la versión 1.1.4 de Spring Framework, que se lanzó el 31 de enero de 2005. Para agregar LazyConnectionDataSourceProxy a nuestro proyecto Spring Data JPA, solo necesitamos encapsular el DataSource que vamos a proporcionar a LocalContainerEntityManagerFactoryBean con LazyConnectionDataSourceProxy de esta manera:

Con LazyConnectionDataSourceProxy en su lugar, la adquisición de la conexión se llevará a cabo como lo ilustra el siguiente diagrama de secuencia:

Cuando se inicia la JPA EntityTransaction, LazyConnectionDataSourceProxy creará un ConnectionProxy que no activará la adquisición de la conexión al llamar a la llamada setReadOnly(true). En cambio, el indicador de solo lectura se almacena en ConnectionProxy y se establece en la conexión JDBC real después de que se adquiere la conexión porque está a punto de ejecutarse una declaración SQL.
De esta manera, la conexión de base de datos subyacente se adquiere de forma diferida y la carga de FxRate se realizará sin que tengamos una conexión de base de datos.

Conclusión

Spring LazyConnectionDataSourceProxy es una gran utilidad que nos permite adquirir la conexión a la base de datos de forma diferida al utilizar Spring Data JPA.
Al adquirir la conexión a la base de datos lo más tarde posible, podemos reducir el tiempo de respuesta de las transacciones y, por lo tanto, ejecutar más transacciones sucesivas en la unidad de tiempo sobre la misma conexión física a la base de datos.

Loading