日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql as用法_Spring Data R2DBC响应式操作MySQL

發布時間:2023/12/15 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql as用法_Spring Data R2DBC响应式操作MySQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

在使用 R2DBC 操作 MySQL 數據庫 一文中初步介紹了r2dbc-mysql的使用。但是借助于DatabaseClient操作MySQL,過于初級和底層,不利于開發。今天就利用Spring Data R2DBC來演示Spring 數據存儲抽象(Spring Data Repository)風格的R2DBC數據庫操作。

請注意:目前Spring Data R2DBC雖然已經迭代了多個正式版,但是仍然處于初級階段,還不足以運用到生產中。不過未來可期,值得研究學習。

2. Spring Data R2DBC

Spring Data R2DBC提供了基于R2DBC反應式關系數據庫驅動程序的流行的Repository抽象。但是這并不是一個 ORM 框架,你可以把它看做一個數據庫訪問的抽象層或者R2DBC的客戶端程序。它不提供ORM框架具有的緩存、懶加載等諸多特性,但它抽象了數據庫和對象的抽象映射關系,具有輕量級、易用性的特點。

2.1 版本對應關系

胖哥總結了截至目前Spring Data R2DBCSpring Framework的版本對應關系:

Spring Data R2DBCSpring Framework
1.0.0.RELEASE5.2.2.RELEASE
1.1.0.RELEASE5.2.6.RELEASE
1.1.1.RELEASE5.2.7.RELEASE
1.1.2.RELEASE5.2.8.RELEASE

一定要注意版本對應關系,避免不兼容的情況。

3. 基礎依賴

上次我沒有引用R2DBC連接池,這次我將嘗試使用它。主要依賴如下 ,這里我還集成了Spring Webflux:

<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-data-r2dbcartifactId>
dependency>

<dependency>
????<groupId>io.r2dbcgroupId>
????<artifactId>r2dbc-poolartifactId>
dependency>

<dependency>
????<groupId>dev.mikugroupId>
????<artifactId>r2dbc-mysqlartifactId>
dependency>

<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-data-jdbcartifactId>
dependency>

<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webfluxartifactId>
dependency>

這里我采用的是 Spring Boot 2.3.2.RELEASE

4. 配置

上次我們采用的是JavaConfig風格的配置,只需要向Spring IoC注入一個ConnectionFactory。這一次我將嘗試在application.yaml中配置R2DBC的必要參數。

spring:
??r2dbc:
????url:?r2dbcs:mysql://127.0.0.1:3306/r2dbc
????username:?root
????password:?123456

以上就是R2DBC的主要配置。特別注意的是spring.r2dbc.url的格式,根據數據庫的不同寫法是不同的,要看驅動的定義,這一點非常重要。連接池這里使用默認配置即可,不用顯式定義。

5. 編寫業務代碼

接下來就是編寫業務代碼了。這里我還嘗試使用DatabaseClient來執行了DDL語句創建了client_user表,感覺還不錯。

@Autowired
DatabaseClient?databaseClient;

@Test
void?doDDL()?{

????List?ddl?=?Collections.unmodifiableList(Arrays.asList("drop?table?if?exists?client_user;",?"create?table?client_user(user_id?varchar(64)?not?null?primary?key,nick_name?varchar(32),phone_number?varchar(16),gender?tinyint?default?0)?charset?=?utf8mb4;"));
????ddl.forEach(sql?->?databaseClient.execute(sql)
????????????.fetch()
????????????.rowsUpdated()
????????????.as(StepVerifier::create)
????????????.expectNextCount(1)
????????????.verifyComplete());
}

5.1 聲明數據庫實體

熟悉Spring Data JPA的同學應該很輕車熟路了。

/**
?*??the?client?user?type
?*
?*?@author?felord.cn
?*/
@Data
@Table
public?class?ClientUser?implements?Serializable?{
????private?static?final?long?serialVersionUID?=?-558043294043707772L;
????@Id
????private?String?userId;
????private?String?nickName;
????private?String?phoneNumber;
????private?Integer?gender;
}

5.2 聲明 CRUD 接口

上面實體類中的@Table注解是有說法的,當我們的操作接口繼承的是ReactiveCrudRepository 或者ReactiveSortingRepository時,需要在實體類上使用@Table注解,這也是推薦的用法。

public?interface?ReactiveClientUserSortingRepository?extends?ReactiveSortingRepository<ClientUser,String>?{

}

當然實體類不使用@Table注解標記時,我們還可以繼承R2dbcRepository接口。然后ReactiveClientUserSortingRepository將提供一些操作數據庫的方法。

Repository提供的一些默認操作數據庫的方法

然后Spring Data JPA怎么寫,這里也差不多怎么寫,但是有些功能現在還沒有得到支持,比如上面提到的分頁,還有主鍵策略等。

類似PagingAndSortingRepository的反應式分頁功能接口目前還沒有實裝,會在未來的版本集成進來。

5.3 實際操作

接下來我們就要通過R2DBC實際操作MySQL數據庫了。按照我們傳統的邏輯寫了如下的新增邏輯:

ClientUser?clientUser?=?new?ClientUser();

clientUser.setGender(2);
clientUser.setNickName("r2dbc");
clientUser.setPhoneNumber("9527");
clientUser.setUserId("snowflake");

Mono?save?=?reactiveClientUserSortingRepository.save(clientUser);

結果數據庫并沒有寫入數據。這時因為r2dbc-mysql不能被直接使用,只能由客戶端去實現并委托給客戶端去操作。

這也是R2DBC的設計原則,R2DBC 的目標是最小化 SPI 平面,目的是消除數據庫之間的差異部分,并使得整個數據庫完全具有反應式和背壓。它主要用作客戶端庫使用的驅動程序 SPI,而不打算直接在應用程序代碼中使用。

所以這里我們可以借助于reactor-test測試庫去執行一下,改寫為:

reactiveClientUserSortingRepository.save(clientUser)
????????.log()
????????.as(StepVerifier::create)
????????.expectNextCount(1)
????????.verifyComplete();

但是依然不能執行成功,提示update table [client_user]. Row with Id [snowflake] does not exist ,也就是說期望執行的是新增但是實際執行的是更新,由于數據庫找不到主鍵為snowflake的記錄就報了錯。這里為什么是更新呢?

這時因為實體類在進行新增時會判斷主鍵是否填充,如果沒有填充就認為是新數據,采取真正的新增操作,主鍵需要數據庫來自動填充;如果主鍵存在值則認為是舊數據則調用更新操作。胖哥同Spring Data R2DBC的項目組溝通后并沒有得到友好的解決方案,不過我已經找到了方法,這里先留個坑。

那么該如何新增一條數據呢?我們只能借助于@Query注解來編寫一條SQL寫入了:

@Modifying
@Query("insert?into?client_user?(user_id,nick_name,phone_number,gender)?values?(:userId,:nickName,:phoneNumber,:gender)")
Mono?addClientUser(String?userId,?String?nickName,?String?phoneNumber,?Integer?gender);

當添加了@Modifying后,返回值可以從Mono、Mono或者Mono任意一種選擇。

reactiveClientUserSortingRepository
????????.addClientUser("snowflake",
????????????????"r2dbc",
????????????????"132****155",
????????????????0)
????????.as(StepVerifier::create)
????????.expectNextCount(1)
????????.verifyComplete();
r2dbc 寫入成功log

這樣就證明寫成功了一條數據。

5.4 搭配 Webflux 使用

但是實際中該如何應用呢?目前能夠想到的就是結合反應式框架Spring Webflux了,就像Spring Data JPA配合Spring MVC一樣。

我們編寫一個Webflux接口:

@RestController
@RequestMapping("/user")
public?class?ReactiveClientUserController?{

????@Autowired
????private?ReactiveClientUserSortingRepository?reactiveClientUserSortingRepository;


????/**
?????*?這里為了檢驗默認api?就不分層了
?????*
?????*?@param?userId?the?user?id
?????*?@return?the?mono
?????*/
????@GetMapping("/{userId}")
????public?Mono?findUserById(@PathVariable?String?userId)?{
????????return?reactiveClientUserSortingRepository.findById(userId);
????}

}
webflux 通過r2dbc查詢mysql數據庫

5.5 一些測試數據參考

在低并發時,Spring MVC + JDBC表現最佳,但在高并發下,WebFlux + R2DBC使用每個已處理請求的內存最少。

并發下的CPU占用

在高并發下,Spring MVC + JDBC的響應時間開始下降。顯然,R2DBC在更高的并發性下提供了更好的響應時間。Spring WebFlux也比使用Spring MVC的類似實現更好。

吞吐量對比

6. 總結

今天對Spring Data R2DBC進一步演示,相信你能夠從中學到一些東西。由于R2DBC還是比較新,還存在一些需要改進和補充的東西。目前社區非?;钴S,發展十分迅速。好了今天的文章就到這里,原創不易多多關注:碼農小胖哥 ?本文DEMO通過回復sdr 獲取。如果你覺得本文很有用,請點贊、轉發、再看。

往期推薦:

Spring Security 實戰干貨:401和403狀態

2020-07-27

請不要再使用判斷進行參數校驗了

2020-07-25

Spring Security 實戰干貨:從零手寫一個驗證碼登錄

2020-07-22

總結

以上是生活随笔為你收集整理的mysql as用法_Spring Data R2DBC响应式操作MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。