我对反应堆弹簧非常陌生,目前正在探索R2DBC
。
您能解释一下使用R2dbcRepository
而不是将阻塞的JpaRepository
包装到Mono
/ Flux
中有什么好处?
让我举一些例子:
val producer: Mono<BookEntity> = booksReactiveRepository.findById(id)
vs
val producer: Mono<BookEntity> = Mono.fromSupplier { booksBlockingRepository.findById(id) }
执行上有什么概念上的区别吗?
答案 0 :(得分:4)
主要区别在于JDBC / JPA使用阻塞I / O,这意味着每个请求都需要一个专用线程。在高度并发的系统中,这很容易导致扩展问题。
另一方面,R2DBC使用非阻塞I / O,这意味着它只能使用固定的,数量少的线程来处理请求,这使得扩展更容易,更便宜。
检查以下文章: https://spring.io/blog/2018/12/07/reactive-programming-and-relational-databases
Java使用JDBC作为与关系数据库集成的主要技术 数据库。 JDBC具有阻塞性-没有明智的选择 可以减轻JDBC的阻塞性。第一个想法 如何使调用无阻塞将JDBC调用卸载到执行程序 (通常是线程池)。虽然这种方法有些奏效,但它确实 有几个缺点,忽视了反应性的好处 编程模型。
线程池需要(毫无意外)线程才能运行。反应性运行时 通常使用与CPU数量匹配的有限数量的线程 核心。额外的线程会增加开销,并降低 线程限制。此外,JDBC调用通常会堆积在 队列,一旦线程被请求饱和,池将 再次封锁。因此,JDBC现在不是一个选择。