JavaRush /Kurslar /All lectures for UZ purposes /R2DBC'ни ишлатиш

R2DBC'ни ишлатиш

All lectures for UZ purposes
Daraja, Dars
Mavjud

Reactive Relational Database Connectivity (R2DBC) лойиҳаси реляцион маълумотлар базасига реактив программалаш API олиб келади. io.r2dbc.spi.Connection R2DBC дан маълумотлар базасига блокланмаган уланишлар билан ишлаш учун стандарт усул тақдим этади. Уланишлар ConnectionFactory орқали ўтилади, бу jdbc'даги DataSource га ўхшаш.

ConnectionFactory конфигурацияси spring.r2dbc.* ташқи конфигурацион хусусиятлари орқали бошқарилади. Масалан, application.properties да қуйидаги бўлимни эълон қилиш мумкин:

Properties
spring.r2dbc.url=r2dbc:postgresql://localhost/test
spring.r2dbc.username=dbuser
spring.r2dbc.password=dbpass
Yaml
spring:
  r2dbc:
    url: "r2dbc:postgresql://localhost/test"
    username: "dbuser"
    password: "dbpass"
Драйвер учун класс номини ҳужжатлаш шарт эмас, чунки Spring Boot драйверни R2DBC уланиш фабрикаси кашфиёти натижасида олади.
Энг камида, URL манзили кўрсатилиши керак. URL манзилида кўрсатилган маълумот индивидуал хусусиятларга нисбатан устунликка эга, яъни name, username, password ва пулдаги параметрлар.

Агар сиз ConnectionFactory томонидан яратилган уланишларни амалга ошириш учун, яъни марказий маълумотлар базаси конфигурациясида ишлатишни хоҳламайдиган (ёки ишлата олмайдиган) муайян параметрларни белгилаш учун @Bean анотацияси ёрдамида бизни ишлатмоқчи бўлсангиз, қуйидаги мисолда асосий конфигурация параметрларини қўлланилиши кўрсатилган:

Java
import io.r2dbc.spi.ConnectionFactoryOptions; import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) public class MyR2dbcConfiguration { @Bean public ConnectionFactoryOptionsBuilderCustomizer connectionFactoryPortCustomizer() { return (builder) -> builder.option(ConnectionFactoryOptions.PORT, 5432); } } 
Kotlin
import io.r2dbc.spi.ConnectionFactoryOptions import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration(proxyBeanMethods = false) class MyR2dbcConfiguration { @Bean fun connectionFactoryPortCustomizer(): ConnectionFactoryOptionsBuilderCustomizer { return ConnectionFactoryOptionsBuilderCustomizer { builder -> builder.option(ConnectionFactoryOptions.PORT, 5432) } } } 

Қуйидаги мисолларда, PostgreSQL уланишлари учун айрим параметрларни қандай белгилаш кўрсатилади:

Java
import java.util.HashMap; import java.util.Map; import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider; import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @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); } } 
Kotlin
import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @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 ёрдамида боғлашингиз мумкин, қуйидаги мисолда кўрсатилганидек:

Java
import java.util.Map; import reactor.core.publisher.Flux; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; @Component public class MyBean { private final DatabaseClient databaseClient; public MyBean(DatabaseClient databaseClient) { this.databaseClient = databaseClient; }  // ...  public Flux<Map<String, Object>> someMethod() { return this.databaseClient.sql("select * from user").fetch().all(); } } 
Kotlin
import org.springframework.r2dbc.core.DatabaseClient import org.springframework.stereotype.Component import reactor.core.publisher.Flux @Component class MyBean(private val databaseClient: DatabaseClient) {  // ...  fun someMethod(): Flux<Map<String, Any>> { return databaseClient.sql("select * from user").fetch().all() } } 

Spring Data R2DBC репозиторийлари

Spring Data R2DBC репозиторийлари интерфейслар бўлиб, улар маълумотларга кириш олишни таъминлаш учун аниқланиши мумкин. Сўровлар автоматик равишда метод номлари асосида яратилади. Масалан, CityRepository интерфейси маълум бир штатдаги барча шаҳарларни топиш учун findAllByState(String state) методини эълон қилиши мумкин.

Агар фикрлаштирилган сўровлар талаб қилинса, Spring Data дан Query анотациясини методга қўллаб ёза оласиз.

Spring Data репозиторийлари одатан Repository ёки CrudRepository интерфейслари орқали кенгайтирилади. Агар сиз автоконфигурацияни ишлатсангиз, репозиторийлардаги излаш асосий конфигурация синфини ( @EnableAutoConfiguration ёки @SpringBootApplication билан анотацияланган синф) ўз ичига олган пакетдан иборат бўлиб, паст тушади.

Қуйидаги мисолда Spring Data репозиторийлари билан ҳамкорлик интерфейси типик таърифини кўрсатилган:

Java
import reactor.core.publisher.Mono; import org.springframework.data.repository.Repository; public interface CityRepository extends Repository<City, Long> { Mono<City> findByNameAndStateAllIgnoringCase(String name, String state); } 
Kotlin
import org.springframework.data.repository.Repository import reactor.core.publisher.Mono interface CityRepository : Repository<City?, Long?> { fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): Mono<City?>? } 
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION