Usando ConnectionFactory

Spring establece una conexión R2DBC a la base de datos a través de ConnectionFactory. ConnectionFactory es parte de la especificación R2DBC y proporciona un punto de entrada común para los controladores. Permite que el contenedor o marco oculte los problemas de agrupación de conexiones y gestión de transacciones del código de la aplicación. Como desarrollador, no necesita saber en detalle cómo conectarse a una base de datos. Esto es responsabilidad del administrador que instala ConnectionFactory. Probablemente desempeñes ambos roles a medida que desarrollas y pruebas el código, pero no necesariamente necesitas saber cómo está configurada la fuente de datos de producción.

Si está utilizando la capa R2DBC de Spring, puede configurar la suya propia utilizando una implementación de agrupación de conexiones proporcionada por un tercero. Una implementación popular es el grupo R2DBC (r2dbc-pool). Las implementaciones en la distribución Spring son solo para fines de prueba y no proporcionan agrupación.

Para configurar ConnectionFactory:

  1. Establezca una conexión con ConnectionFactory de la misma manera que normalmente obtendría una ConnectionFactory de R2DBC.

  2. Especifique la URL de R2DBC (consulte la documentación del controlador para conocer el valor correcto).

El siguiente ejemplo muestra cómo configurar ConnectionFactory:

Java
ConnectionFactory factory = ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
Kotlin
val factory = ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");

Usando ConnectionFactoryUtils

La clase ConnectionFactoryUtils es una clase auxiliar conveniente y con todas las funciones que proporciona métodos estáticos para establecer conexiones desde ConnectionFactory y cerrar conexiones (si es necesario).

Admite conexiones vinculadas al Context del suscriptor, como R2dbcTransactionManager.

Usando SingleConnectionFactory

La clase SingleConnectionFactory es una implementación de la interfaz DelegatingConnectionFactory que envuelve una única Connection que no se cierra después de cada uso.

Si algún código de cliente llama a close bajo el supuesto de que existe un grupo de conexiones (como cuando se utilizan herramientas de soporte de persistencia), debe establecer la propiedad suppressClose en true. Este parámetro devuelve un proxy que suprime los cierres que envuelven la conexión física. Tenga en cuenta que ya no puede transmitirlo a una Connection nativa ni a un objeto similar.

SingleConnectionFactory es principalmente una clase de prueba y puede usarse para requisitos específicos, como canalización, si su controlador R2DBC permite dicho uso. A diferencia de un grupo ConnectionFactory, le permite reutilizar la misma conexión todo el tiempo, lo que evita la creación excesiva de conexiones físicas.

Usando TransactionAwareConnectionFactoryProxy

TransactionAwareConnectionFactoryProxy es un proxy para la ConnectionFactory de destino. El proxy envuelve este destino ConnectionFactory para mejorar la compatibilidad con las transacciones administradas por Spring.

Es necesario utilizar esta clase si está utilizando un cliente R2DBC que de otro modo no está integrado con el soporte R2DBC de Spring. En este caso, puede continuar usando este cliente y al mismo tiempo hacer que este cliente participe en transacciones administradas por Spring. Generalmente es preferible integrar un cliente R2DBC con acceso adecuado a ConnectionFactoryUtils para la gestión de recursos.

Para obtener más información, consulte el javadoc en TransactionAwareConnectionFactoryProxy.

Usando R2dbcTransactionManager

La Clase R2dbcTransactionManager es una implementación de ReactiveTransactionManager para fuentes de datos R2DBC individuales. Vincula una conexión R2DBC desde la fábrica de conexiones especificada al Context del suscriptor, permitiendo potencialmente una conexión de suscriptor por fábrica de conexiones.

Se requiere código de aplicación para obtener una conexión R2DBC a través de ConnectionFactoryUtils.getConnection(ConnectionFactory) en lugar del estándar R2DBC ConnectionFactory.create().

Todas las clases de marco (por ejemplo, DatabaseClient) utilizan esta estrategia implícitamente. Si la estrategia de búsqueda no se utiliza con este administrador de transacciones, se comporta exactamente igual que uno normal. Por lo tanto, se puede utilizar en cualquier caso.

La clase R2dbcTransactionManager admite niveles de aislamiento personalizados que se aplican a la conexión.