Использование ConnectionFactory
Spring устанавливает соединение R2DBC с базой данных через ConnectionFactory. ConnectionFactory является частью спецификации R2DBC и представляет собой общую точку входа для драйверов. Он позволяет контейнеру или фреймворку скрывать проблемы объединения соединений в пул и управления транзакциями от кода приложения. Как разработчику, вам не требуется подробно знать о том, как подключиться к базе данных. За это отвечает администратор, который устанавливает ConnectionFactory. Скорее всего, вы выполняете обе роли, поскольку разрабатываете и тестируете код, но вам не обязательно знать, как настроен производственный источник данных.
Если вы используете уровень R2DBC из Spring, то можете сконфигурировать свой собственный с помощью реализации пула соединений, предоставленной третьей стороной. Популярной реализацией является пул R2DBC (r2dbc-pool). Реализации в дистрибутиве Spring предназначены только для целей тестирования и не обеспечивают объединение в пул.
Чтобы сконфигурировать ConnectionFactory:
-
Установите соединение с
ConnectionFactoryтак же, как вы обычно получаетеConnectionFactoryиз R2DBC. -
Укажите URL-адрес R2DBC (правильное значение см. в документации к вашему драйверу).
В следующем примере показано, как сконфигурировать ConnectionFactory:
ConnectionFactory factory = ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
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.
ConnectionFactoryUtils для управления ресурсами.
Более подробную информацию смотрите в javadoc по TransactionAwareConnectionFactoryProxy.
Использование R2dbcTransactionManager
Класс R2dbcTransactionManager – это реализация ReactiveTransactionManager для отдельных источников данных R2DBC. Он привязывает R2DBC-соединение от указанной фабрики соединений к Context подписчика, потенциально допуская одно соединение подписчика для каждой фабрики соединений.
Код приложения необходим для получения R2DBC-соединения через ConnectionFactoryUtils.getConnection(ConnectionFactory) вместо стандартного для R2DBC ConnectionFactory.create().
Все классы фреймворка (например, DatabaseClient) используют эту стратегию неявно. Если стратегия поиска не используется с этим менеджером транзакций, то она ведет себя точно так же, как и обычная. Таким образом, в любом случае её можно использовать.
Класс R2dbcTransactionManager поддерживает кастомные уровни изоляции, которые применяются к соединению.