我使用了Vert.x工具包来创建响应式应用程序,并支持诸如MySQL and Postgres之类的关系数据库。我知道Spring为某些NoSQL数据库(如Cassandra和Mongo)提供了响应式支持,但是他们愿意为关系数据库提供相同的支持吗?
答案 0 :(得分:28)
Spring Framework是一个用于提高开发人员生产力的库,Spring的投资组合项目(例如Spring Data,Spring Security,Spring Cloud)也是这样。
这些项目建立在现有的API之上,这些API通过JSR或JEP进行了标准化,或者建立在已被证明是有用且广泛使用的库之上。 Spring团队不会为数据库或其他集成构建驱动程序,这取决于数据库/驱动程序供应商。
Spring WebFlux是典型的Spring模块的一个很好的例子。它基于现有的非阻塞服务器(通过netty,Undertow和Jetty的Project Reactor)之上。 WebFlux为利用Spring组件的无阻塞,反应式应用程序提供了运行时容器,以协助开发和运行此类应用程序。
Vert.x是集成环境的一个很好的例子,它提供了自己的底层实现。 Vert.x经过了高度优化,并且这样的生态系统需要优化的集成。 Vert.x提出了自己的用于各种数据库的实现,并提供了在Vert.x上下文中运行良好的API,但这些API并非JDBC。
正如M-Razavi所述,Java使用JDBC来与关系数据库集成,而JDBC具有阻塞性–减轻JDBC的阻塞性没有明智的选择。将JDBC调用卸载到Executor
(通常为Thread
池)的用途受到限制,因为该池最终会因请求而饱和。 TL; DR,没有可用的API,我们可以在此之上提供反应性的关系数据库集成。
M-Razavi已经提到ADBA,这是Oracle的一项倡议,旨在为使用期货的Java中的异步数据库访问提供标准化的API。 ADBA中的所有内容仍在进行中,ADBA背后的团队很高兴获得反馈。一堆Postgres同事正在研究Postgres ADBA driver,可用于首次实验。
但是,ADBA是未来的目标,我希望我们不会看到ADBA与Java 12一起发布。
有几个独立的驱动程序,例如Reactiverse's reactive-pg-client。这些驱动程序带有特定于供应商的API,并不真正适合于Spring中的更广泛的集成。我们将需要提供更多的层来公开通用的API,并且不能将新的驱动程序仅插入到您的应用程序中,因此它可以即开即用地运行。拥有标准API可以实现可插入性,因此拥有标准API具有巨大的价值。
Pivotal的团队缺乏标准的API和驱动程序不可用,因此开始研究反应性关系API,该API非常适合反应性编程目的。他们提出了R2DBC,代表反应式关系数据库连接。到目前为止,R2DBC是一个孵化器项目,旨在评估可行性并开始讨论驱动程序供应商是否对支持反应性/非阻塞/异步驱动器完全有兴趣。
到目前为止,共有三种驱动程序实现:
R2DBC带有API规范(r2dbc-spi
)和客户端(r2dbc-client
),使SPI可用于应用程序。我们开始探索Spring Data R2DBC集成,该集成通过数据库客户端和支持响应存储库提供响应API。
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();
答案 1 :(得分:4)
Spring WebFlux是创建非阻塞REST应用程序的好方法。开始使用WebFlux时遇到的一个问题是JDBC,因为JDBC正在阻塞。新的学校数据库(如Cassandra或Couchbase)具有非阻塞驱动程序。在Couchbase的情况下,其驱动程序使用RXJava。正在为数据库创建异步驱动程序,以及为创建ADBA而付出的努力。不幸的是,这还处于初期阶段,如果您想与JVM上的SQL数据库进行通讯,则会遇到阻塞驱动程序的问题。
实际上,Spring不负责为关系数据库提供无阻塞驱动程序。