为什么Spring不为关系数据库提供反应式(非阻塞)客户端?Spring框架背后的想法是什么?WebFlux 与 Vert.x 的比较关系数据库接口那么有哪些选择呢?R2DBC来救援?
我使用Vert.x工具包来创建反应式应用程序,支持MySQL和Postgres等关系数据库。我知道Spring为Cassandra和Mongo等一些NoSQL数据库提供了反应式支持,但他们愿意为关系数据库提供相同的支持吗?
我使用Vert.x工具包来创建反应式应用程序,支持MySQL和Postgres等关系数据库。我知道Spring为Cassandra和Mongo等一些NoSQL数据库提供了反应式支持,但他们愿意为关系数据库提供相同的支持吗?
Spring Framework是一个提高开发人员生产力的库,Spring的投资组合项目也是如此,如Spring Data,Spring Security,Spring Cloud。
这些项目建立在现有API之上,这些API要么通过JSR或JEP进行标准化,要么建立在已被证明是有用和广泛使用的库之上。Spring团队不为数据库或其他集成构建驱动程序,这取决于数据库/驱动程序供应商。
Spring WebFlux是典型的Spring模块的一个很好的例子。它建立在现有的非阻塞服务器(Project Reactor via netty,Undertow和Jetty)之上。WebFlux 为非阻塞、反应式应用程序提供了一个运行时容器,利用 Spring 组件来帮助开发和运行此类应用程序。
Vert.x 是集成环境的一个很好的例子,它提供了自己的低级实现。Vert.x经过了大量优化,这样的生态系统需要优化的集成。Vert.x为各种数据库提出了自己的实现,并提供在Vert.x上下文中运行良好的API,但这些API不是JDBC。
正如M-Razavi已经提到的,Java使用JDBC与关系数据库集成,而JDBC具有阻塞性质 - 没有什么明智的办法可以减轻JDBC的阻塞性质。将 JDBC 调用卸载到(通常是池)的有用性有限,因为池最终会因请求而饱和)。TL;DR,没有可用的API,我们可以提供反应式关系数据库集成。Executor
Thread
M-Razavi已经提到了ADBA,这是Oracle的一项举措,旨在为使用期货的Java中的异步数据库访问提供标准化的API。ADBA 中的所有内容仍在进行中,ADBA 背后的团队很乐意获得反馈。一群Postgres人正在开发一个Postgres ADBA驱动程序,可用于第一次实验。
但是,ADBA是未来的目标,我预计我们不会看到ADBA随Java 12一起发布。
有几个独立的驱动程序,例如Activerse的reactive-pg-client。这些驱动程序带有特定于供应商的API,并不适合在Spring中进行更广泛的集成。我们需要提供额外的层来公开一个通用的 API,并且新的驱动程序不能只是插入到你的应用程序中,所以它开箱即用™。拥有标准API允许可插拔性,因此拥有标准API具有巨大的价值。
由于缺乏标准的API和驱动程序的不可用,Pivotal的一个团队开始研究一个反应式关系API,这将是反应式编程目的的理想选择。他们提出了R2DBC,它代表反应式关系数据库连接。截至目前,R2DBC是一个孵化器项目,用于评估可行性并开始讨论驱动程序供应商是否有兴趣支持反应式/非阻塞/异步驱动程序。
截至目前,有三种驱动程序实现:
R2DBC 附带了一个 API 规范 () 和一个客户端 (),使 SPI 可用于应用程序。我们开始探索Spring Data R2DBC集成,该集成通过数据库客户端和支持反应式存储库提供反应式API。r2dbc-spi
r2dbc-client
R2DBC及其生态系统还很年轻,他们要求进行实验和反馈,以收集用例,并查看反应式关系数据库集成是否有意义。
现在,您可以通过Spring Data使用R2DBC,以下代码段显示了使用情况:DatabaseClient
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(…);
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
Mono<Integer> 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<Map<String, Object>> rows = databaseClient.execute()
.sql("SELECT id, name, manual FROM legoset")
.fetch()
.all();
Spring WebFlux是创建非阻塞REST应用程序的好方法。在开始使用 WebFlux 时遇到的一个问题是 JDBC,因为 JDBC 正在阻塞。像Cassandra或Couchbase这样的新学校数据库都有非阻塞驱动程序。在Couchbase的情况下,它的驱动程序使用RXJava。在为数据库创建异步驱动程序方面有一些努力,以及Oracle创建ADBA的努力。不幸的是,这些还处于早期阶段,如果你想与JVM上的SQL数据库交谈,你就会遇到阻塞驱动程序。
实际上,Spring不负责为关系数据库提供无阻塞驱动程序。