单个servlet如何以用户请求的形式处理多个客户端请求?基于单例设计模式,我知道我们创建了一个servlet实例,但单个servlet如何处理数百万个请求。对于涉及它的线程也感到困惑。单个servlet如何处理来自客户端的多个请求
此外,还可以在这里发送任何浏览器规范或设置,以便发送请求或生成为请求发送的线程。
所有的框架都是一样的,还是不同的说例如struts v/s spring?
单个servlet如何以用户请求的形式处理多个客户端请求?基于单例设计模式,我知道我们创建了一个servlet实例,但单个servlet如何处理数百万个请求。对于涉及它的线程也感到困惑。单个servlet如何处理来自客户端的多个请求
此外,还可以在这里发送任何浏览器规范或设置,以便发送请求或生成为请求发送的线程。
所有的框架都是一样的,还是不同的说例如struts v/s spring?
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));
每个请求都在一个单独的线程中处理。这并不意味着tomcat为每个请求创建一个线程。有一个线程池来处理请求。每个servlet还有一个实例,这是默认情况。(Some more information)。 您的servlet应该是Thread Safe
。
如果你的servlet实现SingleThreadModel
接口的servlet的每个线程使用单独的实例。 SingleThreadModel
is deprecated,请勿使用它。
我做了这个答案,因为社会的维基。
您不会创建多个servlet实例。 servlet引擎为每个请求创建一个单独的线程(最大线程数最大值) 性能与线程数相关,而不是servlet实例数。
例如,如果有1000个请求,并且servlet可以生成的最大线程数为100,那么会出现性能下降。
为了避免这个问题,我们可以使用负载平衡器,将多个服务器放在负载平衡器后面。 负载平衡器应配置为根据不同的参数/设置(循环分配,负载分配等)将请求“路由”到任何一台服务器。您需要的负载越多,您应该添加的服务器就越多。但是,这确实会通过负载均衡器发送所有流量,所以重要的是这是冗余且故障转移安全的。
这些servlet被集中在一起,一次不只有一个实例。 – meskobalazs 2015-01-04 12:35:24
您可能想看看[连接器池](http://docs.oracle.com/cd/E23507_01/Platform.20073/ATGInstallGuide/html/s0902tomcatconnectorthreadconfigurati01。HTML)为例。他们通过线程帮助处理多个请求。 – 2015-01-04 12:37:34
@AlexanderTorstling你完全错了。一个servlet是一个单例,并在所有请求之间共享。每个请求都由一个线程提供服务,并发请求由并发线程提供,每个线程同时调用同一个servlet。 – 2015-01-04 12:46:12