单个servlet如何处理以用户请求形式出现的多个客户端请求?基于单例设计模式,我知道我们创建了一个servlet实例,但是单个servlet如何处理数百万个请求。对于涉及它的线程感到困惑。
此处也可以使用任何浏览器规范或设置来发送请求或生成为请求发送的线程。
对于所有框架是否相同,或者它与struts v / s spring不同?
答案 0 :(得分:25)
每个请求都在一个单独的线程中处理。这并不意味着tomcat会为每个请求创建一个线程。有一个线程池来处理请求。每个servlet也有一个实例,这是默认情况。(Some more information)。
您的servlet应为Thread Safe
。
如果您的servlet实现了SingleThreadModel
接口,则每个线程都使用单独的servlet实例。 SingleThreadModel
is deprecated,不要使用它。
我将此答案作为社区维基。
答案 1 :(得分:17)
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));
答案 2 :(得分:5)
您不会创建多个servlet实例。 servlet引擎为每个请求创建一个单独的Thread(最多一些Thread的最大数量) 性能与线程数有关,而不是与servlet实例的数量有关。
例如,如果有1000个请求,并且servlet可以生成的最大线程数为100,那么性能会下降。
为了避免此问题,我们可以通过将多个服务器放在负载均衡器后面来使用负载均衡器。 负载均衡器应配置为" route"基于不同参数/设置(循环分配,负载分配等)对任何一个服务器的请求。您需要的负载越多,您应该添加的服务器就越多。但是,这会通过负载均衡器发送所有流量,因此重要的是冗余和故障转移安全。