将Tomcat配置为仅为每个应用程序引发一个Servlet

时间:2009-08-04 16:08:27

标签: java tomcat servlets

根据我的理解,允许Tomcat根据需要提出尽可能多的servlet副本,以便为请求提供服务。

这会强制我的servlet没有重量级状态,而是将所有状态存储在(singleton)servlet上下文中。

是否可以将Tomcat配置为将我的servlet视为单例,并且无论负载如何都始终只提出一个servlet实例?

4 个答案:

答案 0 :(得分:11)

根据Servlet规范,(v2.4,第2.2节“实例数”):

  

SRV.2.2实例数

     

对于未在分布式环境中托管的servlet(默认), servlet   容器每个servlet声明只能使用一个实例。但是,对于servlet   实现SingleThreadModel接口,servlet容器可以   实例化多个实例以处理繁重的请求加载和序列化请求   一个特定的例子。

回答你的问题很简单:不要实现SingleThreadModel,也不要在web.xml描述符文件中多次声明你的servlet。

答案 1 :(得分:2)

您不希望在Servlet中存储状态的另一个主要原因是它引入了同步问题,如果您想在群集环境中运行则会出现序列化问题等等。如果您不喜欢,这些都很容易避免将状态存储在servlet内部,而不是它在Session(或Request)对象中的位置。

所以真的......你为什么要存储州?出于某种原因,这是一种“推荐做法”。

答案 2 :(得分:1)

不,我不这么认为。但是,实际上tomcat只会实例化一个servlet,即使JavaEE规范允许它实例化几个。大多数(如果不是全部)MVC框架依赖于该假设,并在servlet中存储了大量配置状态。

如果你想安全地播放它,那么不要将你的状态存储在servlet中,将它粘贴在另一个使用单例模式的类中,并从servlet中引用该单例。

答案 3 :(得分:1)

Ditto Matt B.在我吸取这一课之前,我被严重烧伤了一次。我将状态信息存储在servlet对象的静态中。这一切都很好地测试了我们有一台服务器的地方。然后我们部署到我们有一个服务器集群的生产区域,在我们最终弄明白之前,我们得到了非常奇怪的错误。

使用会话或应用程序对象。这就是他们的目的。

故事的道德:当结构的设计者提供一个工具并且当你想要做X时说要使用这个工具时,可能有一个原因。忽视这些建议要非常谨慎。