Проект 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?>? }
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ