Использование ConnectionFactory

Spring устанавливает соединение R2DBC с базой данных через ConnectionFactory. ConnectionFactory является частью спецификации R2DBC и представляет собой общую точку входа для драйверов. Он позволяет контейнеру или фреймворку скрывать проблемы объединения соединений в пул и управления транзакциями от кода приложения. Как разработчику, вам не требуется подробно знать о том, как подключиться к базе данных. За это отвечает администратор, который устанавливает ConnectionFactory. Скорее всего, вы выполняете обе роли, поскольку разрабатываете и тестируете код, но вам не обязательно знать, как настроен производственный источник данных.

Если вы используете уровень R2DBC из Spring, то можете сконфигурировать свой собственный с помощью реализации пула соединений, предоставленной третьей стороной. Популярной реализацией является пул R2DBC (r2dbc-pool). Реализации в дистрибутиве Spring предназначены только для целей тестирования и не обеспечивают объединение в пул.

Чтобы сконфигурировать ConnectionFactory:

  1. Установите соединение с ConnectionFactory так же, как вы обычно получаете ConnectionFactory из R2DBC.

  2. Укажите URL-адрес R2DBC (правильное значение см. в документации к вашему драйверу).

В следующем примере показано, как сконфигурировать 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");

Использование ConnectionFactoryUtils

Класс ConnectionFactoryUtils – это удобный и полнофункциональный вспомогательный класс, который предоставляет статические методы для установления соединений из ConnectionFactory и закрытия соединений (при необходимости).

Он поддерживает подключения с привязкой к Context подписчика, например, R2dbcTransactionManager.

Использование SingleConnectionFactory

Класс SingleConnectionFactory является реализацией интерфейса DelegatingConnectionFactory, который оборачивает одно Connection, не закрываемое после каждого использования.

Если какой-либо клиентский код вызывает close, исходя из предположения, что существует пул соединений (как при использовании инструментов поддержки постоянного хранения данных), следует установить свойство suppressClose в true. Этот параметр возвращает прокси, подавляющий закрытие, который обертывает физическое соединение. Обратите внимание, что больше нельзя приводить его к нативному Connection или подобному объекту.

SingleConnectionFactory является в первую очередь тестовым классом и может быть использован для специфических требований, таких как конвейеризация, если ваш драйвер R2DBC допускает такое использование. В отличие от пула ConnectionFactory, он позволяет повторно использовать одно и то же соединение все время, что позволяет избегать чрезмерного создания физических соединений.

Использование TransactionAwareConnectionFactoryProxy

TransactionAwareConnectionFactoryProxy – это прокси для целевой ConnectionFactory. Прокси обертывает эту целевую ConnectionFactory, чтобы повысить уровень совместимости с транзакциями, управляемыми Spring.

Использование этого класса необходимо, если вы используете клиент R2DBC, который не интегрирован иным образом со средствами поддержки Spring для R2DBC. В этом случае можно продолжать использовать этот клиент и в то же время сделать так, чтобы этот клиент участвовал в транзакциях, управляемых Spring. Как правило, предпочтительнее интегрировать клиент R2DBC с надлежащим доступом к ConnectionFactoryUtils для управления ресурсами.

Более подробную информацию смотрите в javadoc по TransactionAwareConnectionFactoryProxy.

Использование R2dbcTransactionManager

Класс R2dbcTransactionManager – это реализация ReactiveTransactionManager для отдельных источников данных R2DBC. Он привязывает R2DBC-соединение от указанной фабрики соединений к Context подписчика, потенциально допуская одно соединение подписчика для каждой фабрики соединений.

Код приложения необходим для получения R2DBC-соединения через ConnectionFactoryUtils.getConnection(ConnectionFactory) вместо стандартного для R2DBC ConnectionFactory.create().

Все классы фреймворка (например, DatabaseClient) используют эту стратегию неявно. Если стратегия поиска не используется с этим менеджером транзакций, то она ведет себя точно так же, как и обычная. Таким образом, в любом случае её можно использовать.

Класс R2dbcTransactionManager поддерживает кастомные уровни изоляции, которые применяются к соединению.