为什么 Spring 不为关系数据库提供反应式(非阻塞)客户端?
Why does Spring not provide reactive (non-blocking) clients for relational databases?
我用过Vert.x toolkit for creating reactive applications with support for relational DBs like MySQL and Postgres。我知道 Spring 为 Cassandra 和 Mongo 等一些 NoSQL 数据库提供反应式支持,但他们愿意为关系数据库提供同样的支持吗?
Spring WebFlux 是创建非阻塞 REST 应用程序的好方法。当开始使用 WebFlux 时,您 运行 遇到的一个问题是 JDBC,因为 JDBC 正在阻塞。 Cassandra 或 Couchbase 等新学校数据库具有非阻塞驱动程序。在 Couchbase 的案例中,它的驱动程序使用 RXJava。在为数据库创建异步驱动程序方面付出了一些努力,Oracle 也在努力创建 ADBA。不幸的是,现在还处于早期阶段,如果您想与 JVM 上的 SQL 数据库对话,您会遇到阻塞驱动程序。
实际上,Spring 不负责为关系数据库提供 none 阻塞驱动程序。
Spring 框架背后的想法是什么?
Spring Framework 是一个提高开发人员生产力的库,Spring 的投资组合项目也是如此,例如 Spring Data、Spring Security、Spring 云.
这些项目建立在现有 API 之上,这些项目要么通过 JSR 或 JEP 标准化,要么建立在已被证明有用且广泛使用的库之上。 Spring 团队不为数据库或其他集成构建驱动程序,这取决于 database/driver 供应商。
WebFlux 与 Vert.x
相比
Spring WebFlux 是典型 Spring 模块的一个很好的例子。它建立在现有的非阻塞服务器之上(通过 netty、Undertow 和 Jetty 的 Project Reactor)。 WebFlux 为利用 Spring 组件协助开发和 运行 此类应用程序的非阻塞、反应式应用程序提供运行时容器。
Vert.x 是提供自己的低级实现的集成环境的一个很好的例子。 Vert.x 经过大量优化,这样的生态系统需要优化的集成。 Vert.x 为各种数据库提出了自己的实现,并提供了在 Vert.x 上下文中运行良好的 API,但这些 API 不是 JDBC。
关系数据库APIs
正如 M-Razavi 已经提到的,Java 使用 JDBC 与关系数据库集成,并且 JDBC 具有阻塞性质——没有什么明智的人可以做减轻 JDBC 的阻塞性质。将 JDBC 调用卸载到 Executor
(通常是 Thread
池)的用途有限,因为池最终会因请求而饱和)。 TL;DR,没有 API 可用,我们可以在其上提供反应式关系数据库集成。
那么有哪些选择呢?
M-Razavi 已经提到 ADBA 这是 Oracle 的一项举措,旨在使用 futures 在 Java 中为异步数据库访问提供标准化 API . ADBA 中的一切仍在进行中,ADBA 背后的团队很高兴收到反馈。一群 Postgres 人员正在开发可用于首次实验的 Postgres ADBA 驱动程序。
但是,ADBA 是未来的目标,我预计我们不会看到 ADBA 与 Java 12.
一起发布
有几个独立的驱动程序,例如Reactiverse's reactive-pg-client。这些驱动程序带有特定于供应商的 API,并不真正适合 Spring 中更广泛的集成。我们需要提供额外的层来公开一个通用的 API,并且新的驱动程序不能直接插入到您的应用程序中以使其开箱即用™。拥有一个标准 API 允许可插拔性,因此拥有一个标准 API.
具有巨大的价值
R2DBC 来拯救?
缺乏标准 API 且驱动程序不可用,Pivotal started to investigate on a reactive relational API that would be an ideal fit for reactive programming purposes. They came up with R2DBC 的团队代表反应式关系数据库连接。截至目前,R2DBC 是一个孵化器项目,用于评估可行性并开始讨论驱动程序供应商是否有兴趣支持 reactive/non-blocking/asynchronous 驱动程序。
截至目前,共有三种驱动程序实现:
R2DBC 带有一个 API 规范 (r2dbc-spi
) 和一个使 SPI 可用于应用程序的客户端 (r2dbc-client
)。我们开始探索 Spring Data R2DBC 集成,该集成通过数据库客户端和支持反应性存储库提供反应性 API。
R2DBC 及其生态系统还很年轻,需要实验和反馈来收集用例,看看反应式关系数据库集成是否有意义。
现在,您可以通过 Spring 数据使用 R2DBC,以下代码段显示 DatabaseClient
用法:
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(…);
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
Mono<Integer> count = databaseClient.execute()
.sql("INSERT INTO legoset (id, name, manual) VALUES(, , )")
.bind("", 42055)
.bind("", "Description")
.bindNull("", Integer.class)
.fetch()
.rowsUpdated();
Flux<Map<String, Object>> rows = databaseClient.execute()
.sql("SELECT id, name, manual FROM legoset")
.fetch()
.all();
我用过Vert.x toolkit for creating reactive applications with support for relational DBs like MySQL and Postgres。我知道 Spring 为 Cassandra 和 Mongo 等一些 NoSQL 数据库提供反应式支持,但他们愿意为关系数据库提供同样的支持吗?
Spring WebFlux 是创建非阻塞 REST 应用程序的好方法。当开始使用 WebFlux 时,您 运行 遇到的一个问题是 JDBC,因为 JDBC 正在阻塞。 Cassandra 或 Couchbase 等新学校数据库具有非阻塞驱动程序。在 Couchbase 的案例中,它的驱动程序使用 RXJava。在为数据库创建异步驱动程序方面付出了一些努力,Oracle 也在努力创建 ADBA。不幸的是,现在还处于早期阶段,如果您想与 JVM 上的 SQL 数据库对话,您会遇到阻塞驱动程序。
实际上,Spring 不负责为关系数据库提供 none 阻塞驱动程序。
Spring 框架背后的想法是什么?
Spring Framework 是一个提高开发人员生产力的库,Spring 的投资组合项目也是如此,例如 Spring Data、Spring Security、Spring 云.
这些项目建立在现有 API 之上,这些项目要么通过 JSR 或 JEP 标准化,要么建立在已被证明有用且广泛使用的库之上。 Spring 团队不为数据库或其他集成构建驱动程序,这取决于 database/driver 供应商。
WebFlux 与 Vert.x
相比Spring WebFlux 是典型 Spring 模块的一个很好的例子。它建立在现有的非阻塞服务器之上(通过 netty、Undertow 和 Jetty 的 Project Reactor)。 WebFlux 为利用 Spring 组件协助开发和 运行 此类应用程序的非阻塞、反应式应用程序提供运行时容器。
Vert.x 是提供自己的低级实现的集成环境的一个很好的例子。 Vert.x 经过大量优化,这样的生态系统需要优化的集成。 Vert.x 为各种数据库提出了自己的实现,并提供了在 Vert.x 上下文中运行良好的 API,但这些 API 不是 JDBC。
关系数据库APIs
正如 M-Razavi 已经提到的,Java 使用 JDBC 与关系数据库集成,并且 JDBC 具有阻塞性质——没有什么明智的人可以做减轻 JDBC 的阻塞性质。将 JDBC 调用卸载到 Executor
(通常是 Thread
池)的用途有限,因为池最终会因请求而饱和)。 TL;DR,没有 API 可用,我们可以在其上提供反应式关系数据库集成。
那么有哪些选择呢?
M-Razavi 已经提到 ADBA 这是 Oracle 的一项举措,旨在使用 futures 在 Java 中为异步数据库访问提供标准化 API . ADBA 中的一切仍在进行中,ADBA 背后的团队很高兴收到反馈。一群 Postgres 人员正在开发可用于首次实验的 Postgres ADBA 驱动程序。
但是,ADBA 是未来的目标,我预计我们不会看到 ADBA 与 Java 12.
一起发布有几个独立的驱动程序,例如Reactiverse's reactive-pg-client。这些驱动程序带有特定于供应商的 API,并不真正适合 Spring 中更广泛的集成。我们需要提供额外的层来公开一个通用的 API,并且新的驱动程序不能直接插入到您的应用程序中以使其开箱即用™。拥有一个标准 API 允许可插拔性,因此拥有一个标准 API.
具有巨大的价值R2DBC 来拯救?
缺乏标准 API 且驱动程序不可用,Pivotal started to investigate on a reactive relational API that would be an ideal fit for reactive programming purposes. They came up with R2DBC 的团队代表反应式关系数据库连接。截至目前,R2DBC 是一个孵化器项目,用于评估可行性并开始讨论驱动程序供应商是否有兴趣支持 reactive/non-blocking/asynchronous 驱动程序。
截至目前,共有三种驱动程序实现:
R2DBC 带有一个 API 规范 (r2dbc-spi
) 和一个使 SPI 可用于应用程序的客户端 (r2dbc-client
)。我们开始探索 Spring Data R2DBC 集成,该集成通过数据库客户端和支持反应性存储库提供反应性 API。
R2DBC 及其生态系统还很年轻,需要实验和反馈来收集用例,看看反应式关系数据库集成是否有意义。
现在,您可以通过 Spring 数据使用 R2DBC,以下代码段显示 DatabaseClient
用法:
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(…);
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
Mono<Integer> count = databaseClient.execute()
.sql("INSERT INTO legoset (id, name, manual) VALUES(, , )")
.bind("", 42055)
.bind("", "Description")
.bindNull("", Integer.class)
.fetch()
.rowsUpdated();
Flux<Map<String, Object>> rows = databaseClient.execute()
.sql("SELECT id, name, manual FROM legoset")
.fetch()
.all();