首页 > 解决方案 > 使用 R2DBC 的动机是什么?

问题描述

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

你能解释一下在 / 中使用过度包装阻塞有什么好处R2dbcRepository吗?JpaRepositoryMonoFlux

让我举一些例子:

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

对比

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

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

标签: spring-webfluxr2dbcspring-data-r2dbc

解决方案


主要区别在于 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 现在不是一种选择。


推荐阅读