单个 servlet 如何处理来自客户端的多个请求

2022-09-01 09:24:32

单个 Servlet 如何处理以用户请求形式出现的多个客户端请求?基于单例设计模式,我知道我们创建了一个 servlet 的单个实例,但是单个 servlet 如何处理数百万个请求 。对其中涉及的线程也感到困惑。

此外,任何浏览器规范或设置在这里是否都很方便,可以发送请求或生成为请求发送的线程。

它是对所有框架都一样的,还是有所不同,例如支柱v / s弹簧?


答案 1

每个请求都在单独的线程中处理。这并不意味着Tomcat为每个请求创建一个新线程。有一个线程池来处理请求。此外,每个 Servlet 都有一个实例,这是默认情况。(更多信息)。你的 servlet 应该是无状态的,即它应该是无状态的。Thread Safe

enter image description here

如果你的 servlet 实现了接口,那么每个线程都使用单独的 servlet 实例。SingleThreadModel已弃用,不要使用它。SingleThreadModel

SingleThreadModel

我把这个答案作为社区维基。


答案 2

Struts/Spring框架实际上是写在Servlet规范之上的,所以不管你在下面使用什么,它都使用Servlets。

你是对的,只创建了一个 Servlet 实例,但该实例在多个线程之间共享。出于这个原因,你永远不应该在Servlet中共享可变状态。

例如,您已将以下 servlet 映射到http://localhost/myservlet

class MySerlvet extends HttpServlet {

     public void doGet(HttpServletRequest req, HttpServletResponse res) {
          // Get Logic
     }    
}

Web 服务器在其代码中将具有类似(不一定相同)的内容。

MyServlet m = new MyServlet(); // This will be created once

// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));