基本上是根据本教程https://spring.io/guides/gs/accessing-mongodb-data-rest/,我正在使用Spring Boot和MongoDB构建后端服务器。
我所有的存储库都用@RepositoryRestResource注释。每个REST资源库的控制器都用@RestController注释。
我的问题是,Spring Boot中REST应用程序中的数据库操作是阻塞还是非阻塞?也就是说,在等待MongoDB响应时,处理一个特定HTTP请求(例如GET)的线程是否只是空闲,还是同时恢复到某个线程池?
我一直在查找文档,但是在这种情况下,我似乎找不到线程模型的规范。我还一直在研究“在Spring Boot中创建异步应用程序”的教程,但似乎他们没有完全涵盖这个特定问题。
答案 0 :(得分:0)
基于您使用的堆栈,Web层可以在非阻塞上为阻塞。
如果您在Web层上使用了阻塞堆栈(例如,基于 spring-boot-starter-web 的堆栈),则DeferredResult
可用于确保您不不会耗尽请求处理线程。
有关示例用法,请参见下面的代码段
@RestController
public class EntityController {
private ExecutorService executor;
@GetMapping
public DeferredResult<Entity> getEntity(/**params**/) {
DeferredResult<Entity> result = new DeferredResult<>();
// request thread freed and returned to the request handling thread pool
executor.execute(() -> output.setResult(entity)
return result;
}
}
有关DeferredResult
的完整示例,请参见this tutorial