使用R2DBC的动机是什么?

时间:2019-08-04 07:07:49

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

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

您能解释一下使用R2dbcRepository而不是将阻塞的JpaRepository包装到Mono / Flux中有什么好处?

让我举一些例子:

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

vs

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

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

1 个答案:

答案 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现在不是一个选择。