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 以评估可行性并讨论数据库厂商是否有兴趣支持反应式的异步非阻塞驱动程序。最开始只有 PostgreSQLH2MSSQL 三家,现在 MySQL 也加入了进来。Spring Data R2DBC最新版本是0.8.2.RELEASE。除了驱动实现外还提供了 R2DBC 连接池 [3] 和 R2DBC 代理[4]。除此之外还支持云原生应用。

实战R2DBC

可以参考自公众号“码农小胖哥的“:只会JDBC连接MySQL?来试试R2DBC吧

总结

我们需要明确一点,无论 ADBA 还是 R2DBC 都不是为了取代 JDBC 。只是为了补充在响应式编程下的空白。

然而需要你看清的是反应式才是未来。如果你要抓住未来就需要现在就了解一些相关的知识。

R2DBC并没有想象中的那么难,但是间接的需要了解FluxMono等抽象概念。同时目前来说如果不和Webflux框架配合也没有使用场景。

另外这里有一份Spring官方关于R2DBC的 PPT,也是让你更好了解R2DBC的权威资料。

相比较Ktor中返回数据时使用的Kotlin协程suspend挂起函数,个人觉得R2DBC将来会更快被用到生成环境中,毕竟多数服务端开发也是开始转向Java不久,但是RX也只是一个过渡阶段,随着Spring 5开始支持Kotlin,现有的移动端开发(尤其是Android开发)可以很好的向服务端开发过渡,毕竟现在Android开发已经使用Kotlin很长一段时间了。

所以如果你习惯于使用Java开发,那么R2DBC是下一步的方向,如果你喜欢用Kotlin,喜欢使用协程(其实协程的很多API都对应于RXJava类型,可以很快过渡),那么可以多研究Ktor框架,在返回数据时,使用挂起函数,可以参考之前的一篇文章:

参考:

如果觉得我的文章对你有用,请随意赞赏