Reactive Relational Database Connectivity (R2DBC) лойиҳаси реляцион маълумотлар базасига реактив программалаш API олиб келади. io.r2dbc.spi.Connection R2DBC дан маълумотлар базасига блокланмаган уланишлар билан ишлаш учун стандарт усул тақдим этади. Уланишлар ConnectionFactory орқали ўтилади, бу jdbc'даги DataSource га ўхшаш.
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 анотацияси ёрдамида бизни ишлатмоқчи бўлсангиз, қуйидаги мисолда асосий конфигурация параметрларини қўлланилиши кўрсатилган:
@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 бинлари мавжуд бўлса, JDBC дан келадиган DataSource учун одатий автоконфигурация ўчирилади. Агар сиз DataSource учун автоконфигурацияни сақламоқчи бўлсангиз ва уни реактив тирик илова барча ҳолатларда ишлашига рози бўлсангиз, @Configuration анотацияланган синфга @Import(DataSourceAutoConfiguration.class) қўшинг, унда уни қайта фаоллаштириш мумкин бўлади.
Кириштирилган маълумотлар базаси қўллаб-қувватланиши
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) методини эълон қилиши мумкин.
Агар фикрлаштирилган сўровлар талаб қилинса, Spring Data дан Query анотациясини методга қўллаб ёза оласиз.
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?>? }
GO TO FULL VERSION