2010-11-22 76 views
2

嘿,我有一个关于多线程的问题。首先,DispatcherServlet/DispatcherPorlet有多少个实例?它总是唯一的吗?即使有人说每秒10个请求?默认情况下单身服务的情况如何?如果我有一个validationService bean被注入处理程序以提供请求验证,作为单例(默认情况下),我可以依赖它是单例的事实,并且在某些情况下它不会被重新实例化吗?高负荷的春季单身豆

回答

0

这是一个有趣的问题。

正如在this previous question中提到的那样,容器只允许实例化一个servlet实例。在这种情况下,你保证有一个spring上下文和一个singleton。

问题是什么发生在以前版本的Servlet规范,我不确定明确指定此行为。

但实际上,容器只能实例化一个servlet实例 - 我从来没有见过其他的实例。所以假设你只能获得一个应用上下文是安全的。

+0

谢谢,我知道tomcat实例化单例servlet实例,但我从来没有使用除Jetty外的其他任何内容,并且我需要该应用程序是可移植的。 – lisak 2010-11-22 12:25:05

0

根据负载情况,servlet容器创建了多个servlet实例,但开发人员无法控制该。但在大多数情况下,容器维护每个servlet的单个实例(因为无论如何,servlet应该是线程安全的)。

对于Spring singleton bean,这些是每个Web应用程序的单例 - Spring应用程序上下文存储在servlet上下文中(您可以通过WebApplicationContextUtils.getWebApplicationContext(ServletContext)访问它)。

至于可靠性:是的,你可以依靠的事实是,在一个Spring应用程序上下文范围内,每个单独bean的只有一个实例

+0

但是这里是冲突,如果servlet容器在高负载下创建了一些实例,它们要么引用单例DispactherServlet(这不太可能),要么为每个Container servlet创建一个DispatcherServlet实例,除非每个DispatcherServlet afaik有一个句柄(无法想象),并且如果每个dispatcherServlet有一个处理程序,则必须有与处理程序一样多的spring应用程序上下文 – lisak 2010-11-22 11:50:37

+0

看起来您没有仔细阅读我的回复。我没有说每个SERVLET INSTANCE都有一个Spring ApplicationContext。我说有一个上下文PER WEB APPLICATION,不管有多少个servlet实例,或者你定义了多少个不同的DispatcherServlet(你可以定义多个)。 – 2010-11-22 13:26:14

+0

其实有一个Spring ApplicationContext每个SERVLET实例(当然是在一个Web应用程序中)。 Container将请求委托给单例Servlet。当然,您可以定义多个Dispatcher,但我们正在讨论一个调度程序的实例,而不是定义3个调度程序......并且总是只有一个实例 – lisak 2010-11-22 15:12:12