spring-webflux - 使用 R2DBC 的动机是什么?
问题描述
我对反应式弹簧堆栈非常陌生,目前正在探索R2DBC
。
你能解释一下在 / 中使用过度包装阻塞有什么好处R2dbcRepository
吗?JpaRepository
Mono
Flux
让我举一些例子:
val producer: Mono<BookEntity> = booksReactiveRepository.findById(id)
对比
val producer: Mono<BookEntity> = Mono.fromSupplier { booksBlockingRepository.findById(id) }
执行上有什么概念上的区别吗?
解决方案
主要区别在于 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 现在不是一种选择。
推荐阅读
- amazon-web-services - RDS 代理目标组不可用
- docker - 如何基于 maven:3.6.3-openjdk-14 镜像在 docker 容器中安装 aws-cli?
- c# - asp .net core 3.1 JWT和SignalR认证登录部分
- python - 可视化解析树 - 在 python 中嵌套列表到树
- python - 如何在 django 中覆盖现有的权限模型 __str__ 方法()?
- mysql - Regular expression to replace same patterns with another string
- firebase - Flutter/Firebase 类型“String”不是“List”类型的子类型
' - java - 选择时警报对话框不更改
- python - 如何让爬虫从 csv 列表中获取起始 URL 和允许的域?
- r - 密度时间线图