为什么用webwebflux r2dbc
在并发场景,和大数据量场景 有着更好的性能
并发小,数据量小的时候,不一定能提高性能。
我们知道传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的,在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上,因此它的运行环境的可选择行要比传统web框架多的多。
WebFlux提供了一种比其更完美的解决方案。使用非阻塞的方式可以利用较小的线程或硬件资源来处理并发进而提高其可伸缩性。
Spring Data R2DBC项目是Spring Data家族的一部分,可轻松实现基于R2DBC的存储库。R2DBC(Reactive Relational Database Connectivity)是一个使用反应式驱动集成关系数据库的孵化器。Spring Data R2DBC运用熟悉的Spring抽象和repository 支持R2DBC。基于此,在响应式程序栈上使用关系数据访问技术,构建由Spring驱动的程序将变得非常简单。
Spring Data R2DBC旨在从概念上简化。为了实现此目的,它不提供ORM框架的缓存,延迟加载,后写或其他许多功能。这代表Spring Data R2DBC是一个简单,有限,针对特定情况的object mapper。
Spring Data R2DBC提供了一种实用的方法来与您的数据库进行交互,并提供 DatabaseClient 作为应用程序的入口点。提供以下驱动支持。
接下来代码奉上
数据库字段如下
sql如下
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NULL DEFAULT NULL, `age` int NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_520_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'zhangsan', 22); SET FOREIGN_KEY_CHECKS = 1;
User.java
package com.example.demo; import lombok.Data; @Data public class User { private int id; private int age; private String name; }
package com.example.demo; import org.springframework.data.repository.reactive.ReactiveCrudRepository; import reactor.core.publisher.Mono; import java.util.List; public interface UserRepository extends ReactiveCrudRepository<User, Integer> { public Mono<User> getUserByName(String name); }
build.gradle
plugins { id 'org.springframework.boot' version '2.6.0-SNAPSHOT' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { maven { url 'https://maven.aliyun.com/repository/public' } mavenCentral() maven { url 'https://repo.spring.io/milestone' } maven { url 'https://repo.spring.io/snapshot' } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc' implementation 'org.springframework.boot:spring-boot-starter-webflux' runtimeOnly 'org.mariadb:r2dbc-mariadb' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' } test { useJUnitPlatform() }
application.yml
spring: profiles: active: local application: name: demo r2dbc: url: r2dbcs:mariadb://127.0.0.1:3306/test1 #url: r2dbcs:mysql://127.0.0.1:3306/test1 driver-class-name: org.mariadb.jdbc.Driver username: root password: 123456 server: port: 8089 http2: enabled: true
浏览器打开
http://localhost:8089/test