Loading... # JDBC 从10年前的大学时期刚开始接触数据库时,便对JDBC有了印象,感觉设置JDBC连接是一个很繁琐的过程。 在异步非阻塞的数据库驱动连接没有出现的情况下, **Java** 使用 **JDBC** 来操作关系型数据库,而 **JDBC** 是阻塞的、同步的。我们会将JDBC包装在线程池中,但是使用无限队列会导致资源枯竭,而使用受限队列会导致阻塞。 所以迫切需要一种支持响应式的数据库驱动协议。目前市面上有两种响应式数据库驱动协议,我们来了解一下它们。 # ADBA **ADBA[1]** 是 **Oracle** 主导的 **Java** 异步数据库访问的标准 **API** 。它的目的性是集成于未来 **Java** 的标准发行版中,它不打算作为 **JDBC** 的扩展或替代,而是一个完全独立的 **API**,该 **API** 提供对 **JDBC** 相同数据库的完全无阻塞访问。 Pivotal(Spring 官方)认为ADAB是 “the 🐘 in the room“ ,需要使用Java 9的Flow来获得适当的Reactive Streams背压,但是当前使用CompletableFuture来实现,没有背压这一功能。且现在还没有可以使用的Jar实现。 ADBA受Oracle官方支持,这意味着我们很难利用Kotlin语言的优势,毕竟Spring现在都开始往Kotlin转了。 # R2DBC **Spring** 官方在 **Spring 5** 发布了响应式 **Web** 框架 **Spring WebFlux** 之后急需能够满足异步响应的数据库交互 **API** 。由于缺乏标准和驱动,**Pivotal(Spring 官方)** 团队开始研究反应式关系型数据库连接(**Reactive Relational Database Connectivity**),并提出了 **R2DBC** 规范 **API** 以评估可行性并讨论数据库厂商是否有兴趣支持反应式的异步非阻塞驱动程序。最开始只有 **PostgreSQL** 、**H2**、**MSSQL** 三家,现在 **MySQL** 也加入了进来。Spring Data R2DBC最新版本是**0.8.2.RELEASE**。除了驱动实现外还提供了 **R2DBC** 连接池 [3] 和 **R2DBC 代理[4]**。除此之外还支持云原生应用。 ## 实战R2DBC 可以参考自公众号“码农小胖哥的“:[只会JDBC连接MySQL?来试试R2DBC吧](https://mp.weixin.qq.com/s?__biz=MzUzMzQ2MDIyMA%3D%3D&chksm=faa2e275cdd56b63ad85d6c7c43f008021ef9b5460b81987567a60430da45f457e6336f0c265&idx=1&mid=2247485414&scene=21&sn=94b2bc3c0b8eb099671c88e998e925db#wechat_redirect) ## 总结 我们需要明确一点,无论 **ADBA** 还是 **R2DBC** 都不是为了取代 **JDBC** 。只是为了补充在响应式编程下的空白。 然而需要你看清的是**反应式才是未来**。如果你要抓住未来就需要现在就了解一些相关的知识。 **R2DBC**并没有想象中的那么难,但是间接的需要了解`Flux`、`Mono`等抽象概念。同时目前来说如果不和**Webflux**框架配合也没有使用场景。 另外这里有一份**Spring**官方关于**R2DBC**的 PPT,也是让你更好了解**R2DBC**的权威资料。 <button class="btn m-b-xs btn-success " onclick='window.open("http://119.45.20.47:9999/down/ijatQcDcrn9J","_blank")'>R2DBC_Paluch_Folien.pdf 下载</button> 相比较Ktor中返回数据时使用的Kotlin协程suspend挂起函数,个人觉得R2DBC将来会更快被用到生成环境中,毕竟多数服务端开发也是开始转向Java不久,但是RX也只是一个过渡阶段,随着Spring 5开始支持Kotlin,现有的移动端开发(尤其是Android开发)可以很好的向服务端开发过渡,毕竟现在Android开发已经使用Kotlin很长一段时间了。 所以如果你习惯于使用Java开发,那么R2DBC是下一步的方向,如果你喜欢用Kotlin,喜欢使用协程(其实协程的很多API都对应于RXJava类型,可以很快过渡),那么可以多研究Ktor框架,在返回数据时,使用挂起函数,可以参考之前的一篇文章: <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://hellocyc.com/Spring/springboot-with-kotlin-ktor.html" target="_blank" class="post_inser_a no-external-link"> <div class="inner-image bg" style="background-image: url(https://hellocyc.com/usr/uploads/2020/09/4134165634.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Spring❤️ Kotlin and JetBrains❤️ Ktor</p> <div class="inster-summary text-muted"> Spring现在支持使用Kotlin来开发,可以充分利用Kotlin语言的简洁性,以及在使用Gradle插件时,也... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> **参考:** * [ADBA](https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-database) * [R2DBC连接池](https://github.com/r2dbc/r2dbc-pool) * [R2DBC 代理](https://github.com/r2dbc/r2dbc-proxy) * [jasync-sql](https://github.com/jasync-sql/jasync-sql):Java和Kotlin的R2DBC包装器,用**Kotlin**编写的**MySQL**和**PostgreSQL**异步数据库驱动程序 * [r2dbc-h2](https://github.com/r2dbc/r2dbc-h2):为**H2**实现的原生驱动程序,以方便作为测试数据库 * [r2dbc-mysql](https://github.com/mirromutth/r2dbc-mysql*):为**MySQL**实现的原生驱动程序 * [Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc#overview) * [spring-projects](https://github.com/spring-projects)/**[spring-data-examples](https://github.com/spring-projects/spring-data-examples)** © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 0