我正在阅读Async servlets 3.1
据说,当需要进行大量耗时的操作时,释放发送请求的线程。从数据库中获取长数据列表。
我无法理解这里的好处,因为无论如何都会分配一个新的线程来处理数据库连接和响应处理,即使释放了负责该请求的初始线程。
那么Async servlet如何比我们之前使用的每个请求模型更有益。
答案 0 :(得分:1)
在这里分两部分回答:
更新:如果我们已经在使用NIO线程池,我们需要Async Servlets的更多详细信息 我之前在http://manish-m.com/?p=996的非阻塞IO上记下了我的笔记。您还可以在http://manish-m.com/?p=915(特别是此页面上的IO Playground部分)查看相关帖子。
NIO线程池用于处理多个连接请求。它使用内核的非阻塞IO功能,因此少量线程可以与许多连接一起使用。
但是,从网络缓冲区读取数据的相同线程也会执行“用户代码”(我们在servlet中编写)。用于NIO的servlet容器的框架处理接受客户端请求,但是它不能自己处理由我们编写的“阻塞用户代码”。因此,如果我们编写一个占用10秒的DB Query,那么容器框架本身就不能异步处理它。我们将通过在servlet中编写任何阻塞代码来阻止原始的NIO线程池。因此,我们需要显式编写任何我们认为可能阻塞容器请求线程的东西,作为Java EE中的Async servlet。
类似地,当我们使用其他NIO框架(如Netty,MINA)时,我们需要注意确保代码“不”阻止处理网络连接的NIO线程。这通常通过将这样长时间运行的任务卸载到另一个线程池(这是容器在编写异步servlet时所执行的操作)来实现。
答案 1 :(得分:0)
只有很多线程可用于服务HTTP请求。它们来自HTTP线程池,可通过您的应用程序服务器配置机制进行配置(例如,Glassfish的管理UI)。如果您的servlet执行长时间运行操作,则这些请求线程将被占用。一旦所有池化的请求线程被占用,在释放一个请求线程之前,将无法继续提供其他请求。
使用Async servlet,请求线程将返回到池,而不是在非异步情况下被长时间运行的同步操作阻止。