响应式编程已经在 Java 编程领域出现很长一段时间了。具有高性能,事件驱动,充分利用计算资源,更加优雅的异步编程体验,同时它也提供了背压机制来防止系统过载。很长一段时间 Java 的响应式只能同 MongoDB 、 Redis 等这些非关系型数据库进行交互。而目前我们大部分的数据还是存放在关系型数据库中,大部分情况下 Java 使用 JDBC 来操作关系型数据库,而 JDBC 是阻塞的、同步的。所以迫切需要一种支持响应式的数据库驱动协议。目前市面上有两种响应式数据库驱动协议,我们来了解一下它们。
ADBA [1] 是 Oracle 主导的 Java 异步数据库访问的标准 API 。它的目的性是集成于未来 Java 的标准发行版中,目前发展比较慢,目前只提供 OpenJDK 的 沙盒特性 [2] 供开发者研究之用。它不打算作为 JDBC 的扩展或替代,而是一个完全独立的 API ,该 API 提供对 JDBC 相同数据库的完全无阻塞访问。
Spring官方在 Spring 5 发布了响应式 Web 框架 Spring WebFlux 之后急需能够满足异步响应的数据库交互 API 。 由于缺乏标准和驱动, Pivotal(Spring 官方) 团队开始研究反应式关系型数据库连接( Reactive Relational Database Connectivity ),并提出了 R2DBC 规范 API 以评估可行性并讨论数据库厂商是否有兴趣支持反应式的异步非阻塞驱动程序。最开始只有 PostgreSQL 、 H2 、 MSSQL 三家,现在 MySQL 也加入了进来。 R2DBC 最新版本是 0.8.1.RELEASE 。除了驱动实现外还提供了 **R2DBC** 连接池 [3] 和 R2DBC 代理 [4] 。除此之外还支持云原生应用。
目前可用的驱动有:
cloud-spanner-r2dbc [5] :用于 Google Cloud Spanner 的驱动程序
jasync-sql [6] : Java 和 Kotlin 的 R2DBC 包装器,用 Kotlin 编写的 MySQL 和 PostgreSQL 异步数据库驱动程序。
r2dbc-h2 [7] :为 H2 实现的原生驱动程序,以方便作为测试数据库。
r2dbc-postgres [8] :为 PostgreSQL 实现的原生驱动程序。
r2dbc-mssql [9] :为 Microsoft SQL Server 实现的原生驱动程序。
r2dbc-mysql [10] :为 MySQL 实现的原生驱动程序。
我们需要明确一点,无论 ADBA 还是 R2DBC 都不是为了取代 JDBC 。只是为了补充在响应式编程下的空白。至于反应式的未来如何,目前还不是很明朗,但是发展很迅速,我还是很看好的。就目前来说 ADBA 具有官方加持的优势,而 R2DBC 具有活跃的社区优势,究竟谁是业界规则的领导者,相信很快就会揭晓。后续我也会实验性的来尝试使用 R2DBC 并分享其中的一些经验,多多关注