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

shi*_*har 23 java multithreading servlets

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

此处也可以使用任何浏览器规范或设置来发送请求或生成为请求发送的线程.

对于所有框架是否相同,或者它与struts v/s spring不同?

Ali*_*.Kh 29

每个请求都在一个单独的线程中处理.这并不意味着tomcat会为每个请求创建一个线程.有一个线程池来处理请求.每个servlet也有一个实例,这是默认情况.(更多信息).你的servlet应该是Thread Safe.

在此输入图像描述

如果您的servlet实现了SingleThreadModel接口,则每个线程都使用单独的servlet实例.SingleThreadModel已弃用,请勿使用.

SingleThreadModel的

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

  • @xtiger:有很多方法可以使您的 servlet 成为线程安全的。例如,如果您不使用在类范围中定义的变量,它将是线程安全的。 (2认同)

sha*_*zin 19

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

你是对的,只创建了一个Servlet实例,但该实例是在多个线程之间共享的.因此,您不应该在Servlet中共享可变状态.

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

class MySerlvet extends HttpServlet {

     public void doGet(HttpServletRequest req, HttpServletResponse res) {
          // Get Logic
     }    
}
Run Code Online (Sandbox Code Playgroud)

Web服务器的代码中会有类似的东西(不一定相同).

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

// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));
Run Code Online (Sandbox Code Playgroud)


sid*_*tha 5

您不创建多个servlet实例.servlet引擎为每个请求创建一个单独的Thread(最多一些Thread的数量).性能与Threads的数量有关,而不是servlet的实例数.

例如,如果有1000个请求,并且servlet可以生成的最大线程数为100,那么性能会下降.

为了避免这个问题,我们可以通过将多个服务器放在负载均衡器后面来使用负载均衡器.负载均衡器应配置为根据不同的参数/设置(循环分配,负载分配等)将请求"路由"到任何一个服务器.您需要的负载越多,您应该添加的服务器就越多.但是,这会通过负载均衡器发送所有流量,因此重要的是冗余和故障转移安全.