为什么 Spring 不为关系数据库提供反应式(非阻塞)客户端?

2024-03-15

我用过Vert.x https://vertx.io/用于创建反应式应用程序的工具包,支持关系数据库,例如MySQL 和 Postgres https://vertx.io/docs/vertx-mysql-postgresql-client/java/。我知道 Spring 为一些 NoSQL 数据库(如 Cassandra 和 Mongo)提供反应式支持,但他们愿意为关系数据库提供相同的支持吗?


Spring 框架背后的想法是什么?

Spring Framework 是一个提高开发人员生产力的库,Spring Data、Spring Security、Spring Cloud 等 Spring 的组合项目也是如此。

这些项目构建在现有 API 之上,这些 API 要么通过 JSR 或 JEP 进行标准化,要么构建在已被证明有用且广泛使用的库之上。 Spring 团队不为数据库或其他集成构建驱动程序,这取决于数据库/驱动程序供应商。

WebFlux 与 Vert.x 相比

Spring WebFlux 是典型 Spring 模块的一个很好的例子。它构建在现有的非阻塞服务器之上(Project Reactor via netty、Undertow 和 Jetty)。 WebFlux 为非阻塞、反应式应用程序提供了一个运行时容器,利用 Spring 组件来协助开发和运行此类应用程序。

Vert.x 是集成环境的一个很好的例子,它提供了自己的低级实现。 Vert.x 进行了大量优化,这样的生态系统需要优化集成。 Vert.x 为各种数据库提出了自己的实现,并提供了在 Vert.x 上下文中运行良好的 API,但这些 API 不是 JDBC。

关系数据库 API

As M-Razavi https://stackoverflow.com/users/601288/m-razavi前面已经提到,Java 使用 JDBC 与关系数据库集成,而 JDBC 具有阻塞性质——没有任何明智的措施可以减轻 JDBC 的阻塞性质。将 JDBC 调用卸载到Executor(通常Thread池)的实用性受到限制,因为池最终会因请求而饱和)。 TL;DR,没有可用的 API 可以让我们提供反应式关系数据库集成。

那么有哪些选择呢?

M-Razavi https://stackoverflow.com/users/601288/m-razavi已经提到过ADBA https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-database这是 Oracle 的一项举措,旨在为使用 future 的 Java 异步数据库访问提供标准化 API。 ADBA 的所有工作仍在进行中,ADBA 背后的团队很高兴收到反馈。一群 Postgres 人员正在开发一个Postgres ADBA 驱动程序 https://github.com/pgjdbc/pgadba可用于第一次实验。

然而,ADBA 是一个未来的目标,我预计我们不会看到 ADBA 与 Java 12 一起发布。

有几个独立的驱动程序,例如Reactiveverse 的reactive-pg-client https://github.com/reactiverse/reactive-pg-client。这些驱动程序带有特定于供应商的 API,并不真正适合在 Spring 中进行更广泛的集成。我们需要提供额外的层来公开通用 API,并且新的驱动程序不能只是插入到您的应用程序中,以便它可以开箱即用™。拥有标准 API 可以实现可插拔性,因此拥有标准 API 具有巨大的价值。

R2DBC 来救援?

由于缺乏标准 API 和驱动程序,团队Pivotal https://pivotal.io开始研究一种非常适合反应式编程目的的反应式关系 API。他们想出了R2DBC http://r2dbc.io它代表反应式关系数据库连接。截至目前,R2DBC 是一个孵化器项目,用于评估可行性并开始讨论驱动程序供应商是否有兴趣支持反应式/非阻塞/异步驱动程序。

到目前为止,共有三种驱动程序实现:

  • PostgreSQL https://github.com/r2dbc/r2dbc-postgresql
  • H2 https://github.com/r2dbc/r2dbc-h2
  • 微软SQL服务器 https://github.com/r2dbc/r2dbc-mssql

R2DBC 附带 API 规范(r2dbc-spi)和一个客户(r2dbc-client)使 SPI 可用于应用程序。我们开始探索Spring Data R2DBC https://github.com/spring-projects/spring-data-r2dbc通过数据库客户端和支持反应式存储库提供反应式 API 的集成。

R2DBC 及其生态系统还很年轻,需要进行实验和反馈来收集用例并看看反应式关系数据库集成是否有意义。

现在,您可以通过 Spring Data 使用 R2DBC,以下代码片段显示DatabaseClient usage:

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Spring 不为关系数据库提供反应式(非阻塞)客户端? 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐