Використання 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 підтримує кастомні рівні ізоляції, які застосовуються до з'єднання.