mysql的r2dbc_使用R2DBC实现数据库的响应式访问
Reactive Programming可以看作是一种编程模型,它通过创建事件驱动的非阻塞功能管道来促进可扩展性和稳定性,这些管道对资源的可用性和可处理性做出反应。延迟执行,并发和异步性只是底层编程模型的结果。
只有当整个堆栈都是被动的并且所有参与的组件(应用程序代码,运行时容器,集成)都遵循延迟执行,非阻塞API和数据流的流式特性时,响应式编程的全部好处才会生效 - 基本上遵循基本假设。
虽然可以将非反应性组件引入以函数响应式编写的应用程序,但最终结果是对可扩展性和稳定性影响,实际预期收益减少。在最坏的情况下,运行时行为很少或没有区别。但是,响应式编程有助于提高代码的可读性。
如果我们查看响应式生态系统,我们将发现几个框架,库和集成。他们每个人都有自己的特长。通过通用方法或在特定响应框架的上下文中,可以很好地涵盖许多功能领域。我们来讨论关系数据库集成。
最常见的问题是:我们什么时候可以使用API进行响应性关系数据库集成?
Java使用JDBC作为与关系数据库集成的主要技术。JDBC具有阻塞性 - 没有什么可以减轻JDBC的阻塞性质。关于如何使调用无阻塞的第一个想法是将JDBC调用卸载到Executor(通常是Thread池)。虽然这种方法有些作用,但它有几个缺点,忽略了响应式编程模型的好处。
响应运行时通常使用与CPU核心数匹配的有限数量的线程。额外的线程引入开销并减少线程限制的影响。此外,JDBC调用通常会堆积在队列中,一旦线程充满请求,池将再次阻塞。所以,JDBC现在不是唯一一个选择。
响应式数据库API
Oracle宣布推出ADBA,该计划旨在通过使用期货为Java中的异步数据库访问提供标准化API。Postgres正在研究可用于第一次实验的Postgres ADBA驱动程序。PgNio是Postgres的另一个异步驱动程序,它开始尝试使用ADBA。
ADBA的可用性未知。它绝对不会在Java 12的版本中可使用,ADBA计划首次亮相的Java版本目前尚不清楚。
以下代码段显示了使用INSERT和SELECT语句的ADBA :
DataSource ds = dataSource();
CompletableFuture t;
try (Session session = ds.getSession()) {
Submission submit = session
.rowCountOperation(
"INSERT INTO legoset (id, name, manual) "+"VALUES($1, $2, $3)")
.set("$1", 42055, AdbaType.INTEGER)
.set("$2","Description", AdbaType.VARCHAR)
.set("$3", null, AdbaType.INTEGER)
.apply(Result.RowCount::getCount)
.submit();
t = submit.getCompletionStage().toCompletableFuture();
}
t.join();
CompletableFuture>> t;
try (Session session = ds.getSession()) {
Submission>> submit = session
.>> rowOperation("SELECT id, name, manual FROM legoset")
.collect(collectToMap())// custom collector.submit();
t = submit.getCompletionStage().toCompletableFuture();
}
t.join();
请注意,这collectToMap(…)是应用程序提供的函数的示例,该函数将结果提取到所需的返回类型。
R2DBC
由于缺乏标准API和驱动程序不可用,Pivotal的团队开始研究反应性关系API的想法,该API非常适合用于反应式编程。他们提出了R2DBC,它代表了Reactive Relational Database Connectivity。截至目前,R2DBC是一个孵化器项目,用于评估可行性并开始讨论驱动程序供应商是否有兴趣支持反应/非阻塞/异步驱动程序。
截至目前,有三种驱动程序实现:
R2DBC附带API规范(r2dbc-spi)和客户端(r2dbc-client),使SPI可用于应用程序。
以下代码段显示R2DBC SPI使用INSERT和SELECT语句:
ConnectionFactory connectionFactory = null;
Mono count = Mono.from(connectionFactory.create())
.flatMapMany(it ->
it.createStatement(
"INSERT INTO legoset (id, name, manual) "+"VALUES($1, $2, $3)")
.bind("$1", 42055)
.bind("$2","Description")
.bindNull("$3", Integer.class)
.execute())
.flatMap(io.r2dbc.spi.Result::getRowsUpdated)
.next();
Flux> rows = Mono.from(connectionFactory.create())
.flatMapMany(it -> it.createStatement("SELECT id, name, manual FROM legoset").execute())
.flatMap(it -> it.map((row, rowMetadata) -> collectToMap(row, rowMetadata)));
虽然上面的代码有点笨重,但R2DBC还附带了一个客户端库项目,用于更人性化的用户API。R2DBC SPI不用于直接使用,而是通过客户端库使用。
使用R2DBC客户端重写的相同代码将是:
R2dbc r2dbc = new R2dbc(connectionFactory);
Flux count = r2dbc.inTransaction(handle ->
handle.createQuery(
"INSERT INTO legoset (id, name, manual) "+"VALUES($1, $2, $3)")
.bind("$1", 42055)
.bind("$2","Description")
.bindNull("$3", Integer.class)
.mapResult(io.r2dbc.spi.Result::getRowsUpdated));
Flux> rows = r2dbc
.inTransaction(handle -> handle.select("SELECT id, name, manual FROM legoset")
.mapRow((row, rowMetadata) -> collectToMap(row, rowMetadata));
请注意,collectToMap(…)作为应用程序提供的函数的示例,该函数将结果提取到所需的返回类型。
Spring Data团队将Spring Data R2DBC作为孵化器启动,通过数据库客户端提供响应API并支持反应式存储库。使用Spring Data R2DBC重写的示例代码将是:
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
Mono count = databaseClient.execute()
.sql(
"INSERT INTO legoset (id, name, manual) "+"VALUES($1, $2, $3)")
.bind("$1", 42055)
.bind("$2","Description")
.bindNull("$3", Integer.class)
.fetch()
.rowsUpdated();
Flux> rows = databaseClient.execute()
.sql("SELECT id, name, manual FROM legoset")
.fetch()
.all();
R2DBC及其生态系统仍然很年轻,并要求进行实验和反馈以收集用例,并查看反应性关系数据库集成是否有意义。
Fibers的JDBC
虽然JDBC和其他技术暴露了阻塞API(主要是由于等待I / O),但Project Loom引入Fibers了轻量级抽象,将阻塞API转变为非阻塞API。一旦调用遇到阻塞API,就可以通过堆栈切换实现这一点。因此Fiber,继续使用阻塞API的先前流程的基础尝试。
该Fiber执行模式大大减少了所需的原生线程数。结果是更好的可伸缩性和非阻塞行为 - 通过卸载对Fiber-backed的阻塞调用Executor。我们所需要的只是一个适当的API,允许在Fiber实现上使用非阻塞JDBC 。
结论
反应式编程和关系数据库的未来是什么?老实说,我不知道。如果我尝试了一个有根据的猜测,我可以看到Project Loom和它的基于Fiber的Executor与成熟的JDBC驱动程序相结合,成为业界潜在的游戏规则改变者。随着Java的加速发布节奏,这可能并不遥远。
ADBA的目标是包含在Java标准版运行时中,根据当前的时间表,我预计它将在早于2021年的Java 17中出现。
与现在可用的R2DBC形成对比。它配备了驱动程序和客户端,并允许实验使用。R2DBC的一个简洁的副作用是它暴露完全反应的API,同时独立于底层数据库引擎。随着已经发布的版本,没有必要猜测Project Loom,也不需要等待三年才能测试其驱动API。今天就可以使用R2DBC。
mysql的r2dbc_使用R2DBC实现数据库的响应式访问相关推荐
- r2dbc mysql_使用R2DBC实现数据库的响应式访问
Reactive Programming可以看作是一种编程模型,它通过创建事件驱动的非阻塞功能管道来促进可扩展性和稳定性,这些管道对资源的可用性和可处理性做出反应.延迟执行, 并发和异步性 只是底层编 ...
- PHP学习笔记 第八讲 Mysql.简介和创建新的数据库
八.Mysql.简介和创建新的数据库 1.mysql简介与概要 mysql是一个小型关系型数据管理系统,开发者为瑞典mysqlab公司现在已经被sun公司收购 1.可以处理拥有上千万条记录的大型数据 ...
- mysql2已经存在数据数据导入,在MYSQL中导入已存在的数据库
MYSQL似乎很好玩,有一次看见一个同学神速般地创建一个数据量庞大的数据库,当时没搞清楚是什么回事.后来我重装MYSQL,得自己重新建数据库, 我一头雾水,这么多字段,肯定不是一个一个输入字段,再请教 ...
- MySQL第4天:MySQL的架构介绍之修改数据库编码格式
MySQL的架构介绍之修改数据库编码格式 1.配置文件介绍 #编写时间:2017.3.6 #编写地点:广州 上一篇文章可知mysql的配置文件在:/usr/share/mysql,其中/usr/sha ...
- MySQL使用命令备份和还原数据库
这篇文章主要介绍了MySQL使用命令备份和还原数据库,本文使用Mysql内置命令实现备份和还原,比较简单,需要的朋友可以参考下 数据库在使用当中都会有数据库备份工作,当数据库发生严重错误无法启动,或者 ...
- mysql创立不了数据库_以下不属于MySQL安装时自动创建的数据库是( ) (5.0分)_学小易找答案...
[单选题]下列删除itcast数据库的sql语句中,正确的是 (5.0分) [单选题]MySQL提供的( )语句可查看数据表的创建语句. (5.0分) [单选题]下面选项中,属于定点数的类型是 (5. ...
- jmeter+mysql+set_Jmeter中如何进行对数据库压测(上)
前言 表面看来,JMeter与本系列课程似乎关系不大,但实际上在后面的很多场景中起着重要作用:如何获知修改了某些代码或者设置之后系统性能是提升了还是下降了呢? 商业的压力测试工具LoadRunner确 ...
- mysql基础小测试三_数据库---MySQL(三)
一.视图 视图是一个虚拟表,是sql的查询结果,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[i ...
- Mysql、Oracle、SQLServer等数据库参考文档免费分享下载
场景 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统 ...
- linux python连接oracle数据库_Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法...
本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL.Oracle.SQL Server数据库. 其中包括以下几个软件的安装及配置: ...
最新文章
- 【pytorch】torch.mean的使用
- html5 fc,HTML5_mob604756fc093d的技术博客_51CTO博客
- leetcode 519. Random Flip Matrix | 519. 随机翻转矩阵(洗牌算法Fisher–Yates shuffle)
- 砰的一声,实验室又炸鸡了
- vue项目,webpack中配置src路径别名及使用
- Tomcat启动时自动加载Servlet
- 深度学习实践与部署(开篇)
- 论文阅读-多任务(2021)-YOLOP:用于自动驾驶目标检测与语义分割的实时多任务模型
- IPC$***--个人练习
- 【Java小游戏】飞翔的小鸟项目介绍
- 西门子cnc sinumerik_2020邯郸cnc加工中心编程要多久就是工厂傅
- 某剧院有33排座位java_行测备考资料:数量关系深处隐藏的整除技巧
- 希腊女孩创办自媒体教希腊语,如今用户已达1000人
- 拒酒词、与领导喝酒的诀窍、酒量不行的技巧
- linux移植中出现【can‘t open /dev/ttyO0: No such file or directory】解决方式
- 微信小程序授权登录和获取手机号功能(详细)
- 微服务框架springcloud(实用篇)【5】Elasticsearch 01
- Linux防火墙设置
- Mac Sublime Text 3中文汉化
- python数据去重(pandas)