Проект Reactive Relational Database Connectivity (R2DBC) привносит API реактивного программирования в реляционные базы данных. io.r2dbc.spi.Connection
из R2DBC предусматривает стандартный метод работы с неблокирующими подключениями к базе данных. Подключения передаются с помощью ConnectionFactory
, аналогично DataSource
в jdbc.
Конфигурацией ConnectionFactory
управляют внешние конфигурационные свойства из spring.r2dbc.*
. Например, можно объявить следующий раздел в application.properties
:
spring.r2dbc.url=r2dbc:postgresql://localhost/test
spring.r2dbc.username=dbuser
spring.r2dbc.password=dbpass
spring:
r2dbc:
url: "r2dbc:postgresql://localhost/test"
username: "dbuser"
password: "dbpass"
name
, username
, password
и параметрами объединения в пул.Чтобы настроить соединения, создаваемые ConnectionFactory
, то есть задать определенные параметры, которые вы не желаете (или не можете) настраивать в конфигурации вашей центральной базы данных, можно использовать помеченный аннотацией @Bean
бин ConnectionFactoryOptionsBuilderCustomizer
. В следующем примере показано, как вручную переопределить порт базы данных, в то время как остальные параметры будут браться из конфигурации приложения:
@Configuration(proxyBeanMethods = false)
public class MyR2dbcConfiguration {
@Bean
public ConnectionFactoryOptionsBuilderCustomizer connectionFactoryPortCustomizer() {
return (builder) -> builder.option(ConnectionFactoryOptions.PORT, 5432);
}
}
@Configuration(proxyBeanMethods = false)
class MyR2dbcConfiguration {
@Bean
fun connectionFactoryPortCustomizer(): ConnectionFactoryOptionsBuilderCustomizer {
return ConnectionFactoryOptionsBuilderCustomizer { builder ->
builder.option(ConnectionFactoryOptions.PORT, 5432)
}
}
}
В следующих примерах показано, как установить некоторые параметры соединения 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)
}
}
}
Если имеется бин ConnectionFactory
, обычная автоконфигурация для DataSource
из JDBC отключается. Если необходимо сохранить автоконфигурацию для DataSource
из JDBC, и при этом вас устраивает риск использования блокирующего JDBC API в реактивном приложении, добавьте @Import(DataSourceAutoConfiguration.class)
в класс, помеченный аннотацией @Configuration
, в вашем приложении, чтобы повторно активировать ее.
Поддержка встроенных баз данных
Аналогично средствам поддержки JDBC фреймворк Spring Boot может автоматически конфигурировать встроенную базу данных для реактивного режима использования. URL-адреса любого подключения указывать не требуется. Необходимо только добавить зависимость сборки к встроенной базе данных, которую вы хотите использовать, как это показано в следующем примере:
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-h2</artifactId>
<scope>runtime</scope>
</dependency>
Если вы используете эту функцию в своих тестах, то можете заметить, что одна и та же база данных повторно используется всем вашим тестовым комплектом, независимо от количества контекстов приложения, которые вы используете. Если необходимо убедиться, что для каждого контекста имеется отдельная встроенная база данных, следует установить spring.r2dbc.generate-unique-name
в true
.
Использование DatabaseClient
Бин DatabaseClient
является автоконфигурируемым, но вы можете привязать его через аннотацию @Autowire
непосредственно к своим собственным бинам, как это показано в следующем примере:
@Component
public class MyBean {
private final DatabaseClient databaseClient;
public MyBean(DatabaseClient databaseClient) {
this.databaseClient = databaseClient;
}
}
@Component
class MyBean(private val databaseClient: DatabaseClient) {
}
Репозитории Spring Data R2DBC
Репозитории Spring Data R2DBC – это интерфейсы, которые можно определить для получения доступа к данным. Запросы создаются автоматически на основе имен методов. Например, интерфейс CityRepository
может объявить метод findAllByState(String state)
для поиска всех городов в данном штате.
В случае более сложных запросов можно аннотировать метод с помощью аннотации Query
из Spring Data.
Репозитории Spring Data обычно расширяются за счет интерфейсов Repository
или CrudRepository
. Если вы используете автоконфигурацию, поиск в репозиториях ведется от пакета, содержащего основной конфигурационный класс (тот, который аннотирован @EnableAutoConfiguration
или @SpringBootApplication
), и вниз по иерархии.
В следующем примере показано типичное определение интерфейса взаимодействия с репозиторием 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?>?
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ