我想通过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明确指出实际的[...] query execution will occur in a task that has been submitted to a Spring TaskExecutor
。所以它并不是真正的非阻塞,而只是使用一个不能很好地扩展的线程池来解耦我的线程。
因此我的问题是:
如何使用MongoDB异步驱动程序的NIO功能以非阻塞模式执行查询?
到目前为止,我看到的唯一解决方法是摆脱Spring Data并使用Mongo Async Driver API自己实现数据库查询。但希望我只是错过了一些东西,并且有一个直截了当的答案。 ;)
答案 0 :(得分:1)
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客户端API。
答案 1 :(得分:1)
从Spring Data Kay M1开始,最终引入了反应式API,该API允许使用ReactiveCrudRepository接口进行非阻塞数据访问。
blog post of the Spring team about it很不错。
如今,Spring Data documentation中也提到了这一点,但请记住,如果您已经通过使用@Async功能启动了您的项目,而不将其与新的反应式api混合使用,正如文档中明确指出的那样:“异步查询执行是与反应式查询执行不同,因此不能混用。”