El proyecto Conectividad reactiva de bases de datos relacionales (R2DBC) lleva la API de programación reactiva a bases de datos relacionales. io.r2dbc.spi.Connection
de R2DBC proporciona un método estándar para tratar con conexiones de bases de datos sin bloqueo. Las conexiones se pasan usando ConnectionFactory
, similar a DataSource
en jdbc.
La configuración de ConnectionFactory
está controlada por propiedades de configuración externas de spring.r2dbc.*
. Por ejemplo, podría declarar la siguiente sección en application.properties
:
spring.r2dbc.url=r2dbc:postgresql://localhost/test
spring.r2dbc.nombre de usuario=dbuser
spring.r2dbc.password=dbpass
spring:
r2dbc:
url: "r2dbc:postgresql://localhost/test"
username: "dbuser"
password: "dbpass"
name
,
username
,
password
y parámetros de agrupación.
Para personalizar las conexiones creadas por ConnectionFactory
, es decir, para establecer ciertos parámetros que no desea (o no puede) configurar en la configuración de su base de datos central, puede utilizar un anotación @Bean
bean ConnectionFactoryOptionsBuilderCustomizer
. El siguiente ejemplo muestra cómo anular manualmente el puerto de la base de datos mientras el resto de las configuraciones se toman de la configuración de la aplicación:
@Configuration(proxyBeanMethods = false) public class MyR2dbcConfiguration { @Bean public ConnectionFactoryOptionsBuilderCustomizer connectionFactoryPortCustomizer() { return (builder) -> builder.option(ConnectionFactoryOptions.PORT, 5432); } }
@Configuration(proxyBeanMethods = false) clase Configuración MyR2dbc { @Frijol divertido ConnectionFactoryPortCustomizer(): ConnectionFactoryOptionsBuilderCustomizer { return ConnectionFactoryOptionsBuilderCustomizer { constructor -> opción.constructor(ConnectionFactoryOptions.PORT, 5432) } } }
Los siguientes ejemplos muestran cómo configurar algunos parámetros de conexión PostgreSQL:
@Configuration(proxyBeanMethods = false) public class MyPostgresR2dbcConfiguration { @Bean public ConnectionFactoryOptionsBuilderCustomizer postgresCustomizer() { Map<String, String> options = new HashMap<>(); options.put("lock_timeout", "30s"); options.put("statement_timeout", "60s"); return (builder) -> builder.option(PostgresqlConnectionFactoryProvider.OPTIONS, options); } }
@Configuration(proxyBeanMethods = false) class MyPostgresR2dbcConfiguration { @Bean fun postgresCustomizer(): ConnectionFactoryOptionsBuilderCustomizer { val options: MutableMap<String, String> = HashMap() options["lock_timeout"] = "30s" options["statement_timeout"] = "60s" return ConnectionFactoryOptionsBuilderCustomizer { builder -> builder.option(PostgresqlConnectionFactoryProvider.OPTIONS, options) } } }
Si hay presente un bean ConnectionFactory
, la configuración automática normal para DataSource
desde JDBC está deshabilitada. Si necesita conservar la configuración automática para DataSource
de JDBC y se siente cómodo con el riesgo de utilizar una API JDBC de bloqueo en una aplicación reactiva, agregue @Import(DataSourceAutoConfiguration.class)
a la clase marcada con la anotación @Configuration
, en tu aplicación para volver a habilitarla.
Soporte para bases de datos integradas
Al igual que la compatibilidad con JDBC, el marco Spring Boot puede configurar automáticamente la base de datos integrada para uso reactivo. No es necesario que proporcione ninguna URL de conexión. Solo necesita agregar una dependencia de compilación a la base de datos integrada que desea usar, como se muestra en el siguiente ejemplo:
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-h2</artifactId>
<scope>runtime</scope>
</dependency>
Si utiliza esta función en sus pruebas, puede observar que todo el conjunto de pruebas reutiliza la misma base de datos, independientemente del número de contextos de aplicación que utilice. Si necesita asegurarse de que cada contexto tenga una base de datos integrada independiente, debe establecer spring.r2dbc.generate-unique-name
en true
.
Usando el cliente de base de datos
El bean DatabaseClient
es autoconfigurable, pero puede vincularlo mediante la anotación @Autowire
directamente a sus propios beans, como se muestra en el siguiente ejemplo:
@Component public class MyBean { private final DatabaseClient databaseClient; public MyBean(DatabaseClient databaseClient) { this.databaseClient = databaseClient; } // ... }
@Component class MyBean(private val databaseClient: DatabaseClient) { }
Repositorios Spring Data R2DBC
Los repositorios Spring Data R2DBC son interfaces que se pueden definir para acceder a los datos. Las consultas se crean automáticamente en función de los nombres de los métodos. Por ejemplo, la interfaz CityRepository
podría declarar un método findAllByState(String state)
para buscar todas las ciudades en un estado determinado.
Para consultas más complejas, puede anotar el método utilizando la anotación Query
de Spring Data.
Los repositorios de Spring Data normalmente se amplían utilizando las interfaces Repository
o CrudRepository
. Si utiliza la configuración automática, los repositorios se buscan desde el paquete que contiene la clase de configuración principal (la que está anotada con @EnableAutoConfiguration
o @SpringBootApplication
) y hacia abajo en la jerarquía.
El siguiente ejemplo muestra una definición de interfaz típica para interactuar con un repositorio de Spring Data:
public interface CityRepository extends Repository<City, Long> { Mono<City> findByNameAndStateAllIgnoringCase(String name, String state); }
interface CityRepository : Repository<City?, Long?> { fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): Mono<City?>? }
GO TO FULL VERSION