Mis*_*s94 11 java spring-data reactive spring-webflux r2dbc
我使用Vert.x工具包来创建反应式应用程序,支持MySQL和Postgres等关系数据库.我知道Spring为像Cassandra和Mongo这样的NoSQL DB提供了反应支持,但是他们是否愿意为关系数据库提供相同的支持?
mp9*_*1de 31
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驱动程序.
但是,ADBA是未来的目标,我希望我们不会看到ADBA与Java 12一起发布.
有一些独立的驱动程序,如Reactiverse的reactive-pg-client.这些驱动程序附带特定于供应商的API,并不适合在Spring中进行更广泛的集成.我们需要提供额外的层来公开一个通用的API,而新的驱动程序不能只是插入你的应用程序,因此它可以开箱即用.拥有标准API允许可插拔性,因此拥有标准API具有巨大价值.
由于缺乏标准API和驱动程序不可用,Pivotal的团队开始研究一种反应性关系API,它非常适合用于反应式编程.他们提出了R2DBC,它代表了Reactive Relational Database Connectivity.截至目前,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();
Run Code Online (Sandbox Code Playgroud)
Spring WebFlux是创建非阻塞REST应用程序的好方法。开始使用WebFlux时遇到的一个问题是JDBC,因为JDBC正在阻塞。新的学校数据库(如Cassandra或Couchbase)具有非阻塞驱动程序。在Couchbase的情况下,其驱动程序使用RXJava。为数据库创建异步驱动程序需要付出一些努力,而Oracle则需要创建ADBA。不幸的是,这些还处于初期,如果您想与JVM上的SQL数据库进行通讯,则必须使用阻塞驱动程序。
实际上,Spring不负责为关系数据库提供无阻塞驱动程序。
| 归档时间: |
|
| 查看次数: |
3438 次 |
| 最近记录: |