【问题标题】:What is the motivation for using R2DBC?使用 R2DBC 的动机是什么?
【发布时间】:2019-08-04 07:07:49
【问题描述】:

我对响应式弹簧堆栈非常陌生,目前正在探索R2DBC

您能解释一下使用R2dbcRepository 比将阻塞JpaRepository 包装成Mono/Flux 有什么好处吗?

让我举一些例子:

val producer: Mono<BookEntity> = booksReactiveRepository.findById(id)

val producer: Mono<BookEntity> = Mono.fromSupplier { booksBlockingRepository.findById(id) }

在执行上有什么概念上的区别吗?

【问题讨论】:

标签: spring-webflux r2dbc spring-data-r2dbc


【解决方案1】:

主要区别在于 JDBC/JPA 使用阻塞 I/O,这意味着每个请求都需要一个专用线程。在高度并发的系统中,这很容易导致扩展问题。

另一方面,R2DBC 使用非阻塞 I/O,这意味着它能够仅使用固定的少量线程来处理请求,这使得扩展更容易且更便宜。

查看以下文章: https://spring.io/blog/2018/12/07/reactive-programming-and-relational-databases

Java 使用 JDBC 作为与关系集成的主要技术 数据库。 JDBC 具有阻塞性质——没有什么明智的 可以减轻 JDBC 的阻塞性质。第一个想法 如何使调用非阻塞正在将 JDBC 调用卸载到 Executor (通常是线程池)。虽然这种方法有些奏效,但它来了 有几个缺点忽略了反应式的好处 编程模型。

线程池需要——毫不奇怪——运行线程。反应式运行时 通常使用与 CPU 数量相匹配的有限数量的线程 核心。额外的线程会引入开销并减少 线程限制。此外,JDBC 调用通常堆积在一个 队列,一旦线程被请求饱和,池将 再次阻止。所以,JDBC 现在不是一个选择。

【讨论】:

  • 我想补充一点,当所有调度程序线程都被 JDBC 阻塞但订阅者仍然拉取新元素时,将 Webflux 与 JDBC 结合可能会导致死锁。 (我在已经投入生产的应用程序中痛苦地了解到这一点)
  • 实际上,jdbc 已经准备好生产了,r2dbc 不是这样,可能在 6 个月内
  • 根据什么标准您认为 r2dbc 已准备好生产?它在一个月前发布了 GA 版本。
猜你喜欢
  • 2021-09-26
  • 2021-12-29
  • 2021-04-21
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多