[英]Configuring Tomcat to only raise one Servlet per application
根据我的理解,允许Tomcat根据需要提出尽可能多的servlet副本以便为请求提供服务。
这会强制我的servlet没有重量级状态,而是将所有状态存储在(singleton)servlet上下文中。
是否可以将Tomcat配置为将我的servlet视为单例,并且无论负载如何,始终只提出一个servlet实例?
根据Servlet规范,(v2.4,第2.2节“实例数”):
SRV.2.2实例数
对于未托管在分布式环境中的servlet (缺省值), servlet容器每个servlet声明必须只使用一个实例。 但是,对于实现
SingleThreadModel
接口的servlet,servlet容器可以实例化多个实例以处理繁重的请求加载并将请求序列化到特定实例。
回答你的问题很简单:不要实现SingleThreadModel
,也不要在web.xml
描述符文件中多次声明你的servlet。
您不希望在Servlet中存储状态的另一个主要原因是它引入了同步问题,如果您想在集群环境中运行则会出现序列化问题等等。如果您不存储,所有这些都很容易避免servlet内部的状态,而不是它在Session(或Request)对象中的位置。
所以真的...你为什么要存储状态? 出于某种原因,这是一种“推荐做法”。
不,我不这么认为。 但是,实际上tomcat只会实例化一个servlet,即使JavaEE规范允许它实例化几个。 大多数(如果不是全部)MVC框架依赖于该假设,并在servlet中存储大量配置状态。
如果你想安全地播放它,那么不要将你的状态存储在servlet中,将它粘贴在另一个使用单例模式的类中,并从servlet中引用该单例。
Ditto Matt B.在我吸取这一课之前,我被严重烧伤了一次。 我将状态信息存储在servlet对象的静态中。 这一切都很好地测试了我们有一台服务器的地方。 然后我们部署到生产,我们有一个服务器集群,在我们最终弄明白之前,我们得到了非常奇怪的错误。
使用会话或应用程序对象。 这就是他们的目的。
故事的道德:当结构的设计者提供一个工具并说你想要做X时使用这个工具时,可能有一个原因。 忽视这些建议要非常谨慎。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.