当前位置: 首页 > 知识库问答 >
问题:

用于简单RESTful调用的反应式R2DBC

姚飞昂
2023-03-14

由于R2DBC是反应式和非阻塞的,我想了解在简单的RESTful CRUD服务中使用R2DBC的好处

假设Spring Boot应用程序正在使用下面的存储库公开RESTful服务

public interface CustomerRepository extends ReactiveCrudRepository<Customer, Long> {

    @Query("SELECT * FROM customer WHERE last_name = :lastname")
    Flux<Customer> findByLastName(String lastName);

}

从服务调用此存储库,结果需要在服务中进行转换,然后才能返回控制器。

Flux<Customer> customers = repository.findAll();

为了访问完整的客户列表,我需要在通量上调用blockLast(),这使得它阻塞并违背了使用反应组件的目的

这是否意味着在这个简单的示例中使用R2DBC没有任何好处?我错过什么了吗?

如果通量集合的处理发生在不同的线程中,那么通量只能用于异步订阅吗?

共有2个答案

云凌
2023-03-14
  1. 由于该方法重新启动Flux,它返回一个可以在未来某个时候完成的promise。
  2. html" target="_blank">调用此方法的线程不应该阻塞-这就是反应式的全部意义。如果您使用. block Last(),您将使调用线程阻塞。正如Michael在这个答案中所说,只有在您将反应式和非反应式代码集成在一起时才应该这样做。
  3. 这是一张解释异步计算如何工作的图表(反应式、CompletableFuture等)。希望这能消除您的疑虑;

如图所示,如果执行。blockLast(),您失去了真正的非阻塞。理想情况下,调用线程应该立即释放,以便可以执行其他工作。

“通量只能用于异步订阅,其中通量集合的处理发生在不同的线程中吗?”-通量只不过是一个promise,它可以在未来的某个时间完成。如图所示,回调将在异步线程上执行。计算完成。您可以使用. PublishOn()切换此线程。

子车高超
2023-03-14

为了访问完整的客户列表,我需要在Flux上调用blockLast(),这使得它阻塞并违背了使用反应组件的目的

如果要实际获取对列表的引用,只需调用blockLast()

如果您只想一次访问完整的客户列表,您可以明智地调用collectList()以获得一个

这里唯一要注意的是内存占用-如果您只是处理Flux

这是否是一个问题取决于您的用例。如果你说的是10个左右的客户,那没问题。如果你说的是数十亿美元,那么这可能不是一个明智的解决方案

 类似资料:
  • 我有一个下面的对象列表,方法返回被动类型

  • 我用一个由 它的工作罚款与 但是如果我试着在后台用 我明白了 正在启动开发服务器。。。 事件。js:174投掷者;//未处理的“错误”事件^ 错误:EBADF:坏的文件描述符,读取发射'错误'事件在:在lazyFs.read(内部/fs/streams.js:165: 12)在FSReqWrap.wrapper[作为一个完整的](fs.js:467: 17)npm ERR!代码ELIFECYCLE

  • 问题内容: 我正在设计一个简单的聊天应用程序(仅此而已)。我一直想知道该聊天应用程序的简单设计。为了给您概述..这是规则: 匿名用户仅使用昵称输入聊天。(用户ID)大概是由系统在后台分配的。 他们可以加入(订阅)聊天对话。并且他将看到来自其他用户的聊天文本出现在指定区域。 他们可以回复特定的对话,其他所有人都应该看到。 而已!(请参阅我告诉您的那是一个简单的聊天应用程序)。因此,我的意图并不是真正

  • 我面临的问题是,有一个服务,我必须调用,这是一个传统的Spring启动应用程序,而不是反应性的! 下面是一个示例endpoint,它接近上述遗留系统的想法: 我知道我不能用这个来实现真正的反应性善,有没有一个快乐的非阻塞和阻塞的媒介我可以在这里实现? 谢谢

  • 我希望从spring reactive WebClient进行SOAP调用。我找不到任何文件。想知道会有什么方法。现在我在想 null 缺点和其他方法是什么?

  • 问题内容: 我将用Java进行RESTful调用。但是,我不知道如何拨打电话。我是否需要使用URLConnection或其他?谁能帮我。谢谢。 问题答案: 如果从服务提供商(例如Facebook,Twitter)调用RESTful服务,则可以选择以下任意一种方式: 如果您不想使用外部库,则可以使用或(对于SSL),但这是封装在中的Factory类型模式中的调用java.net.URLConnect