2015-01-04 53 views
16

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

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

所有的框架都是一样的,还是不同的说例如struts v/s spring?

+1

这些servlet被集中在一起,一次不只有一个实例。 – meskobalazs 2015-01-04 12:35:24

+0

您可能想看看[连接器池](http://docs.oracle.com/cd/E23507_01/Platform.20073/ATGInstallGuide/html/s0902tomcatconnectorthreadconfigurati01。HTML)为例。他们通过线程帮助处理多个请求。 – 2015-01-04 12:37:34

+2

@AlexanderTorstling你完全错了。一个servlet是一个单例,并在所有请求之间共享。每个请求都由一个线程提供服务,并发请求由并发线程提供,每个线程同时调用同一个servlet。 – 2015-01-04 12:46:12

回答

11

Struts/Spring框架实际上是在Servlet规范的基础上编写的,因此无论您在Servlet规范下使用什么都可以。

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

例如你有以下的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)); 
20

每个请求都在一个单独的线程中处理。这并不意味着tomcat为每个请求创建一个线程。有一个线程池来处理请求。每个servlet还有一个实例,这是默认情况。(Some more information)。 您的servlet应该是Thread Safe

enter image description here

如果你的servlet实现SingleThreadModel接口的servlet的每个线程使用单独的实例。 SingleThreadModel is deprecated,请勿使用它。

SingleThreadModel

我做了这个答案,因为社会的维基。

+0

所以在这种情况下,这种情况背后的机制是什么?如果我们不使用SingleThreadModel,那么这个servlet就不是线程安全的,我们该如何克服这个问题? – xtiger 2015-04-13 05:36:24

+1

@xtiger:有很多方法可以让你的servlet成为线程安全的。例如,如果你不使用在类作用域中定义的变量,它将是线程安全的。 – 2015-04-14 12:35:57

+0

@Ali Sepehri.Kh你是什么意思,“我把这个答案作为社区维基。” ? – Dedyshka 2015-06-23 12:08:04

2

您不会创建多个servlet实例。 servlet引擎为每个请求创建一个单独的线程(最大线程数最大值) 性能与线程数相关,而不是servlet实例数。

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

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

相关问题