我想通过 Spring Data使用 MongoDB’s Async Client API访问MongoDB来执行非阻塞数据库查询.
到目前为止,我只看到了返回的可能性
> 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); }
但是documentation明确指出实际的查询执行将发生在已提交给Spring TaskExecutor的任务中.所以它不是真正的非阻塞,而只是使用一个不能很好扩展的线程池来解耦我的线程.
因此我的问题是:
如何使用MongoDB异步驱动程序的NIO功能在非阻塞模式下执行查询?
到目前为止,我看到的唯一解决方法是摆脱Spring Data并使用Mongo Async Driver API实现我自己的数据库查询.但希望我只是遗漏了一些内容并且有一个直接的答案. 😉
最佳答案
So it's not really non-blocking but just decoupling my thread using a thread pool which doesn't scale very well.
非阻塞/异步意味着将任务委派给不同的线程而不使用调用线程来完成任务. Spring Data mongodb实现代表了它的主张.
但是你不能说它不会像你期望的那样扩展,因为你可以配置Spring TaskExecutor来满足你的扩展SLA.
记住Spring数据mongodb是一个抽象层,用于简单的开发生命周期,适用于大多数开发用例,并提供良好的非阻塞/异步执行.但是如果你认为你需要更多,那么你必须坚持使用MongoDB自己的Aync Client API.