当前位置: 首页 > news >正文

webflux不支持mysql_为什么spring webflux 和 JDBC在一起会有影响?

不论是Java自带的Future框架,还是 Spring WebFlux,还是 Vert.x,他们都是一种非阻塞的基于Ractor模型的框架(后两个框架都是利用netty实现)。

在阻塞编程模式里,任何一个请求,都需要一个线程去处理,如果io阻塞了,那么这个线程也会阻塞在那。但是在非阻塞编程里面,基于响应式的编程,线程不会被阻塞,还可以处理其他请求。举一个简单例子:假设只有一个线程池,请求来的时候,线程池处理,需要读取数据库IO,这个IO是 NIO非阻塞IO,那么就将请求数据写入数据库连接,直接返回。之后数据库返回数据,这个链接的Selector会有Read事件准备就绪,这时候,再通过这个线程池去读取数据处理(相当于回调),这时候用的线程和之前不一定是同一个线程。这样的话,线程就不用等待数据库返回,而是直接处理其他请求。这样情况下,即使某个业务SQL的执行时间长,也不会影响其他业务的执行。

但是,这一切的基础,是IO必须是非阻塞IO,也就是NIO(或者AIO)。官方JDBC没有NIO,只有BIO实现。这样无法让线程将请求写入链接之后直接返回,必须等待响应。但是也就解决方案,就是通过其他线程池,专门处理数据库请求并等待返回进行回调,也就是业务线程池A将数据库BIO请求交给线程池B处理,读取完数据之后,再交给A执行剩下的业务逻辑。这样A也不用阻塞,可以处理其他请求。但是,这样还是有因为某个业务SQL的执行时间长,导致B所有线程被阻塞住队列也满了从而A的请求也被阻塞的情况,这是不完美的实现。真正完美的,需要JDBC实现 NIO

Java 自带的 Future框架可以这么用JDBC:

@GetMapping

public DeferredResult get() {

DeferredResult deferredResult = new DeferredResult<>();

CompletableFuture.supplyAsync(() -> {

return 阻塞数据库IO;

//dbThreadPool用来处理阻塞的数据库IO

}, dbThreadPool).thenComposeAsync(result -> {

//spring 的 DeferredResult 来实现异步回调写入结果返回

deferredResult.setResult(result);

});

return deferredResult;

}

WebFlux 也可以使用阻塞JDBC,但是同理:

@GetMapping

public Mono get() {

return Mono.fromFuture(CompletableFuture.supplyAsync(() -> {

return 阻塞数据库IO;

//dbThreadPool用来处理阻塞的数据库IO

}, dbThreadPool));

}

Vert.x 也可以使用阻塞的JDBC,也是同理:

@GetMapping

public DeferredResult get() {

DeferredResult deferredResult = new DeferredResult<>();

getResultFromDB().setHandler(asyncResult -> {

if (asyncResult.succeeded()) {

deferredResult.setResult(asyncResult.result());

} else {

deferredResult.setErrorResult(asyncResult.cause());

}

});

return deferredResult;

}

private WorkerExecutor dbThreadPool = vertx.createSharedWorkerExecutor("DB", 16);

private Future getResultFromDB() {

Future result = Future.future();

dbThreadPool.executeBlocking(future -> {

return 阻塞数据库IO;

}, false, asyncResult -> {

if (asyncResult.succeeded()) {

result.complete(asyncResult.result());

} else {

result.fail(asyncResult.cause());

}

});

return result;

}

相当于通过另外的线程池(当然也可以通过原有线程池,反正就是要用和请求不一样的线程,才能实现回调,而不是当次就阻塞等待),封装了阻塞JDBC IO。

但是,这样几乎对数据库IO主导的应用性能没有提升,还增加了线程切换,得不偿失。所以,需要使用真正实现了NIO的数据库客户端,例如:

Vert.x实现了各种数据库的基础NIO客户端:https://vertx.io/docs/​vertx.ioVert.x DocumentationVert.x Documentation​vertx.io

R2DBC是一个各种数据库的NIO客户端,目前实现了PG,H2还有SQL Server等等:R2DBC​r2dbc.io

如果你想使用MySQL,推荐 Jasync-sqljasync-sql​github.com

相关文章:

  • go 关于接口和类的说法_Go 面试每天一篇(第 8 天)
  • go 操作cassandra_[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(五)
  • go语言能转csv_Go 每日一库之 casbin:权限管理
  • java中的this_深入理解Java中this关键字的使用
  • Rediis mysql哪个好_rediis介绍与安装,持久化存储,发布订阅,事务
  • 504 压测geteway_loadrunner压测过程常出现错误和处理方法
  • html命名侧边栏_html+css3+jquery右侧弹出侧边栏导航菜单
  • mysql atlas分表_数据切分——Atlas读写分离Mysql集群的搭建
  • mysql internal_MySQL Internal 札记
  • mysql中8warings_查看MySQL的warnings内容的命令
  • php mysql分页显示图片_php mysql 分页显示代码
  • python中三种分支结构的语句有_Python零基础入门学习09:程序控制流程:顺序结构和分支结构...
  • python蜂窝状六边形_CSS-蜂窝状展示区域(多个六边形)的一种实现方式
  • vue 图片自适应排列插件_vue+heatmap.js实现自定义图片热力图并且自适应
  • 阿里云服务器ubuntu安装mysql_Ubuntu安装MySQL-阿里云开发者社区
  • Android单元测试 - 几个重要问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS3 变换
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java 最常见的 200+ 面试题:面试必备
  • Just for fun——迅速写完快速排序
  • mongo索引构建
  • Python学习之路13-记分
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0项目引入element-ui
  • webpack+react项目初体验——记录我的webpack环境配置
  • yii2权限控制rbac之rule详细讲解
  • 服务器从安装到部署全过程(二)
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于springcloud Gateway中的限流
  • 记录一下第一次使用npm
  • 记一次删除Git记录中的大文件的过程
  • 前端之React实战:创建跨平台的项目架构
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何设计一个比特币钱包服务
  • 深入浏览器事件循环的本质
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 算法之不定期更新(一)(2018-04-12)
  • 怎样选择前端框架
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring Batch JSON 支持
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ${ }的特别功能
  • $L^p$ 调和函数恒为零
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (五)Python 垃圾回收机制
  • 、写入Shellcode到注册表上线