Spring Boot是否阻止数据库操作?

时间:2018-10-18 20:49:49

标签: java spring mongodb spring-boot asynchronous

基本上是根据本教程https://spring.io/guides/gs/accessing-mongodb-data-rest/,我正在使用Spring Boot和MongoDB构建后端服务器。

我所有的存储库都用@RepositoryRestResource注释。每个REST资源库的控制器都用@RestController注释。

我的问题是,Spring Boot中REST应用程序中的数据库操作是阻塞还是非阻塞?也就是说,在等待MongoDB响应时,处理一个特定HTTP请求(例如GET)的线程是否只是空闲,还是同时恢复到某个线程池?

我一直在查找文档,但是在这种情况下,我似乎找不到线程模型的规范。我还一直在研究“在Spring Boot中创建异步应用程序”的教程,但似乎他们没有完全涵盖这个特定问题。

1 个答案:

答案 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