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