我正在阅读异步Servlet 3.1
据说当有很多耗时的操作要执行时,例如从数据库中获取较长的数据列表,发送请求的线程就被释放了。
我无法理解这里的好处,因为无论如何释放了负责该请求的初始线程,无论如何都会分配一个新线程来处理数据库连接和响应处理。
因此,异步servlet比我们之前拥有的每个请求模型线程更多的好处。
在这里分为两个部分:
更新:如果我们已经在使用NIO线程池,那么为什么需要异步Servlet的更多详细信息,我前一段时间在http://manish-m.com/?p=996上的非阻塞IO上记下了我的笔记。您也可以在http://manish-m.com/?p=915(尤其是此页面上的IO Playground部分)上查看相关文章。
NIO线程池用于处理多个连接请求。它使用内核的非阻塞IO功能,因此少量线程可以与许多连接一起工作。
但是,从网络缓冲区读取数据的相同线程也执行“用户代码”(我们在Servlet中编写的代码)。Servlet容器的NIO框架可以处理接受客户端请求,但不能自行处理由我们编写的“阻止用户代码”。因此,如果我们编写一个耗时10秒的数据库查询,那么容器框架将无法自行异步处理它。我们将通过在servlet中编写任何阻塞代码来阻塞原始的NIO线程池。因此,我们需要显式地编写任何我们认为可能阻塞容器的请求线程的内容,作为Java EE中的Async servlet。
同样,当我们使用其他NIO框架(如Netty,MINA)时,则需要注意确保代码“不”阻塞处理网络连接的NIO线程。这通常是通过将这样长时间运行的任务卸载到另一个线程池中来实现的(这是您编写异步servlet时容器所做的事情)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句