爱心技术专栏专题

servlet实例的个数及因此引发的问题

摘录:java基础 来源:java基础 加入时间:2007年03月10日
摘要:
servlet实例的个数及因此引发的问题

在缺省情况下,一个容器中只为每个servlet定义生成一个servlet类实例。在servlet实现SingleThreadModel接口的情况下,容器可以生成多个实例以应付沉重的请求,也可以将请求排队发送给同一个实例(对于一个高性能的容器,也可能是这两种方式的结合,因为实例的个数是有限制的,因此在线程安全方式下一个实例会有多个请求…

转载:转载请保留本信息,本文来自
http://www.51dibs.com
/html/2006/article/info8/a_5f65370c88635987.htm

servlet实例的个数及因此引发的问题

站点:爱心种子小博士 关键字:servlet实例的个数及因此引发的问题

   
servlet实例的个数及因此引发的问题
在缺省情况下,一个容器中只为每个servlet定义生成一个servlet类实例。在servlet实现SingleThreadModel接口的情况下,容器可以生成多个实例以应付沉重的请求,也可以将请求排队发送给同一个实例(对于一个高性能的容器,也可能是这两种方式的结合,因为实例的个数是有限制的,因此在线程安全方式下一个实例会有多个请求排队等待服务同时容器中多个实例可以对请求进行服务)。对于为可分布式(distributable)应用开发的servlet而言,在每个JVM中对每个SERVLET定义都会有一个实例,如果在这样的应用中servlet也实现了SingleThreadModel接口,那么在每个JVM中每个servlet定义也可能有多个实例。

使用SingleThreadModel接口可以保证一个线程一次性执行完给定实例的service方法,需要注意的是这个保证只能应用于servlet实例,那些可以被多个servlet实例访问的对象(例如HttpSession实例)依然对多个servlet有效,即使他们实现了SingleThreadModel。

根据规范中的这些说明,我们在实现自己的serlvet时需要考虑多线程的问题,一般而言,不要在servlet中定义可变的成员,只能定义一些常量(使用final定义,如果没有使用,应该注意在程序中不应该修改其值),笔者见过一个定义很差的servlet:
public class SomeHttpServlet extends HttpServlet {

    HttpSession session;
    ...
}

这样的servlet在使用中一定会出现问题,所有的用户都会共用一个session(这样很节约系统资源,不是吗?:)),因此一个用户请求的信息突然跑到另一个用户的ie窗口豪不奇怪。
而且,即使你的servlet实现了SingleThreadModel接口也不要定义可变的成员,因为该成员的信息会保留下来,而这对于其它的用户而言在绝大部分情况下是毫无意义的。(你确定会有意义的情况例外,例如某种计数)

另外需要说明的是上面说明中都是针对servlet定义而言的,而servlet定义定义不等价servlet类定义,即一个servlet类可能会有多个servlet定义,但是笔者还没有找到servlet定义的定义,规范中提到实例化一个servlet时可能会有不同的初始参数,但是这个也不同于带参数的多个构造方法。一般情况下我们可以认为一个servlet类对应一个servlet定义。

客户服务中心信箱:[email protected] [email protected] 网站地图

声明

合作伙伴: