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

MongoDB的Spring数据中的非阻塞查询?

刘承运
2023-03-14

我想通过使用MongoDB的异步客户机API访问MongoDB的Spring数据来执行非阻塞数据库查询。

到目前为止,我只看到了返回一个

  • java.util.concurrent.future
  • java.util.concurrent.CompletableFuture
  • org.springframework.util.concurrent.ListenableFuture

并使用@async注释查询方法,例如。

public interface UserRepo extends Repository<User, Long> {

  @Async
  ListenableFuture<User> findByName(String name);

}

但文档明确指出,实际的[...]查询执行将发生在已提交给Spring TaskExecutor的任务中。所以它并不是真正的非阻塞,而是使用线程池来解耦线程,而这个线程池并不是很好地伸缩。

因此,我的问题是:

如何使用MongoDB异步驱动程序的NIO特性在非阻塞模式下执行查询?

到目前为止,我看到的唯一的解决办法是摆脱Spring数据,并使用Mongo异步驱动程序API实现数据库查询。但希望我只是错过了一些东西,有一个很好的答案在那里。;)

共有1个答案

凌嘉志
2023-03-14

从Spring Data Kay M1开始,最后引入了一个反应性API,它允许使用ReactiveCrudRepository接口进行非阻塞数据访问。
Spring团队有一篇关于它的很好的博客文章。
现在Spring Data文档中也提到了它。但是如果您已经使用@Async特性启动了项目,请记住,不要将它与新的反应性API混合在一起,因为文档明确指出:“异步查询执行不同于反应性查询执行,不应该混合。”

 类似资料:
  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 我有一个顶点,它有一个处理程序,可以在事件循环线程中调用Vertx的Web客户端。实际的底层API调用是同步的还是异步的?它会阻塞我的事件循环线程吗?假设我的API调用需要30秒才能返回。 我是否需要用Vertx.execute阻塞(p-

  • 问题内容: 非阻塞TCP / IP S和在NIO帮我处理与小数目的线程许多TCP / IP连接。但是UDP 呢?(我必须承认我对UDP不太熟悉。) 即使UDP发送操作未在阻止模式下运行,它似乎也不会阻止。确实存在因拥堵或类似原因导致阻塞的情况吗?我真的很好奇,是否存在这样的情况以及生产环境中可能存在的情况。 如果实际上并没有阻塞,并且我不打算使用已连接并仅绑定到一个端口,那么使用非阻塞模式和and

  • 问题内容: 我在获取ncurses的getch()阻止时遇到了一些问题。默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它可以像Windows中的getch()一样工作。我尝试了各种版本的 (并非同时全部)。如果可能的话,我宁愿不(明确地)使用any 。一个围绕残培环路(),检查特定的返回值是OK了。 问题答案: curses库是一揽子交易。如果不正确初始化库,您不能仅仅提出一个例程并希望

  • 问题内容: 有没有一种方法可以以非阻塞方式使用python的socket.accept()来简单地运行它,并让我检查它是否有任何新连接?我 真的 不想使用线程。谢谢。 问题答案: 您可能想要类似的东西(请参阅文档)。您提供了三个套接字列表:您要监视其可读性,可写性和错误状态的套接字。当新的客户端正在等待时,服务器套接字将是可读的。 该功能将一直阻塞,直到套接字状态之一改变为止。如果您不想永远阻塞,