根据我的理解,允许Tomcat根据需要提出尽可能多的servlet副本,以便为请求提供服务。
这会强制我的servlet没有重量级状态,而是将所有状态存储在(singleton)servlet上下文中。
是否可以将Tomcat配置为将我的servlet视为单例,并且无论负载如何都始终只提出一个servlet实例?
答案 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时说要使用这个工具时,可能有一个原因。忽视这些建议要非常谨慎。