gpt4 book ai didi

jakarta-ee - 异步 Servlet 的好处是什么

转载 作者:行者123 更新时间:2023-12-04 21:40:42 26 4
gpt4 key购买 nike

我正在阅读 Async servlets 3.1

据说当有很多耗时的操作要完成时,发送请求的线程会被释放,例如从数据库中获取一长串数据。

我无法理解这里的好处,因为无论如何都会分配一个新线程来处理数据库连接和响应处理,即使负责请求的初始线程被释放。

那么 Async servlet 如何比我们之前拥有的每个请求模型的线程更有益。

最佳答案

在这里分两部分回答:

  • 异步 servlet 如何比我们之前拥有的每个请求模型的线程更有益 :这个模型早就死了,几乎所有的Java服务器都使用NIO,这使得这些服务器可以使用少数线程处理数百个连接。你也可以为你的应用服务器验证这一点,你会惊喜地看到它 使用蔚来:)。异步 Servlet 与每个线程的一个请求没有任何关系。
  • 那么为什么要使用异步 Servlet :嗯,异步 Servlet 允许完成原始请求,而无需等待异步任务完成(希望长时间运行)。因此远程客户端可以立即得到响应,如果需要,他们可以做一些其他的事情。服务器稍后可以在其中一个线程中处理异步任务。这些异步操作通常在单独的线程池中完成,用于异步操作。用于处理客户端连接的线程池不用于异步操作。

  • 更新:如果我们已经在使用 NIO 线程池,为什么需要 Async Servlets 的更多细节
    前段时间我在 http://manish-m.com/?p=996 上记下了关于非阻塞 IO 的笔记。 .您也可以在 http://manish-m.com/?p=915 查看相关帖子(特别是本页上的 IO Playground 部分)。

    NIO 线程池用于处理多个连接请求。它使用内核的非阻塞 IO 特性,因此少量线程可以处理多个连接。

    但是,从网络缓冲区读取数据的线程也会执行“用户代码”(我们在 servlet 中编写的代码)。 NIO 的 servlet 容器框架处理接受客户端请求,但它不能自己处理我们编写的“阻塞用户代码”。因此,如果我们编写一个需要 10 秒的数据库查询,那么容器框架无法自行异步处理它。我们将通过在 servlet 中编写任何阻塞代码来阻塞原始 NIO 线程池。因此,我们需要明确地编写任何我们认为可能会阻塞容器的请求线程的东西,作为 Java EE 中的异步 servlet。

    同样,当我们使用其他 NIO 框架如 Netty、MINA 时,我们需要注意确保代码“不会”阻塞处理网络连接的 NIO 线程。这通常是通过将这些长时间运行的任务卸载到另一个线程池来实现的(这是编写异步 servlet 时容器所做的)。

    关于jakarta-ee - 异步 Servlet 的好处是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27195655/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com