使用反應式關係數據庫連接規範R2DBC操作MySQL數據庫


1. 簡介


三月份已經介紹過R2DBC,它是一種異步的、非阻塞的關係式數據庫連接規範。儘管一些NoSQL數據庫供應商為其數據庫提供了反應式數據庫客戶端,但對於大多數項目而言,遷移到NoSQL並不是一個理想的選擇。這促使了一個通用的響應式關係數據庫連接規範的誕生。 作為擁有龐大用戶群的關係式數據庫MySQL也有了反應式驅動,不過並不是官方的。但是Spring官方將其納入了依賴池,說明該類庫的質量並不低。所以今天就嘗嘗鮮,試一下使用R2DBC連接MySQL


2. 環境依賴


基於Spring Boot 2.3.1Spring Data R2DBC,還有反應式Web框架Webflux,同時也要依賴r2dbc-mysql庫,所有的Maven依賴為:


       <!--r2dbc mysql 庫-->
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
</dependency>
<!--Spring r2dbc 抽象層-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<!--自動配置需要引入的一個嵌入式數據庫類型對象-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--反應式web框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>


MySQL版本為5.7,沒有測試其它版本。



3. R2DBC配置


所有的R2DBC自動配置都在org.springframework.boot.autoconfigure.data.r2dbc包下,如果要配置MySQL必須針對性的配置對應的連接工廠接口ConnectionFactory,當然也可以通過application.yml配置。個人比較喜歡JavaConfig


@Bean
ConnectionFactory connectionFactory() {
return MySqlConnectionFactory.from(MySqlConnectionConfiguration.builder()
.host("127.0.0.1")
.port(3306)
.username("root")
.password("123456")
.database("database_name")
// 額外的其它非必選參數省略
.build());
}


詳細配置可參考r2dbc-mysql的官方說明:https://github.com/mirromutth/r2dbc-mysql



ConnectionFactory配置好后,就會被注入DatabaseClient 對象。該對象是非阻塞的,用於執行數據庫反應性客戶端調用與反應流背壓請求。我們可以通過該接口反應式地操作數據庫。


4. 編寫反應式接口


我們先創建一張表並寫入一些數據:


create table client_user
(
user_id varchar(64) not null comment '用戶唯一標示' primary key,
username varchar(64) null comment '名稱',
phone_number varchar(64) null comment '手機號',
gender tinyint(1) default 0 null comment '0 未知 1 男 2 女 '
)

對應的實體為:


package cn.felord.r2dbc.config;

import lombok.Data;

/**
* @author felord.cn
*/
@Data
public class ClientUser {

private String userId;
private String username;
private String phoneNumber;
private Integer gender;
}

然後我們編寫一個Webflux的反應式接口:


package cn.felord.r2dbc.config;

import org.springframework.data.r2dbc.core.DatabaseClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;

/**
* The type User controller.
*
* @author felord.cn
* @since 17 :07
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private DatabaseClient databaseClient;

/**
* 查詢
*
* @return 返回Flux序列 包含所有的ClientUser
*/
@GetMapping("/get")
public Flux<ClientUser> clientUserFlux() {
return databaseClient.execute("select * from client_user").as(ClientUser.class)
.fetch()
.all();
}

/**
* 響應式寫入.
*
* @return Mono對象包含更新成功的條數
*/
@GetMapping("/add")
public Mono<Integer> insert() {
ClientUser clientUser = new ClientUser();
clientUser.setUserId("34345514644");
clientUser.setUsername("felord.cn");
clientUser.setPhoneNumber("3456121");
clientUser.setGender(1);

return databaseClient.insert().into(ClientUser.class)
.using(clientUser)
.fetch().rowsUpdated();
}

}

調用接口就能獲取到期望的數據結果。


5. 總結


乍一看R2DBC並沒有想象中的那麼難,但是間接的需要了解FluxMono等抽象概念。同時目前來說如果不和Webflux框架配合也沒有使用場景。就本文的MySQL而言,R2DBC驅動還是社區維護(不得不說PgSQL就做的很好)。


然而需要你看清的是反應式才是未來。如果你要抓住未來就需要現在就了解一些相關的知識。這讓我想起五年前剛剛接觸Spring Boot的感覺。另外這裡有一份Spring官方關於R2DBC的PPT,也是讓你更好了解R2DBC的權威資料。可以關注:碼農小胖哥 回復r2dbc獲取。


關注公眾號:Felordcn 獲取更多資訊


個人博客:https://felord.cn

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】



新北清潔公司,居家、辦公、裝潢細清專業服務



※別再煩惱如何寫文案,掌握八大原則!



網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!



※超省錢租車方案



※教你寫出一流的銷售文案?



Orignal From: 使用反應式關係數據庫連接規範R2DBC操作MySQL數據庫

留言