当前位置: 首页 > 图文教程 > 网络编程 > JSP > servlet实例的个数及因此引发的问题

JSP
缓冲技术提高JSP程序的性能和稳定性
win2k下搭建jsp环境
JSP与XML的结合
JSP中实现全文检索
详细为您解析JSP的环境引擎--Websphere
JSP中图片验证的实现
缓冲技术提高JSP程序性能和稳定性
利用RamdonAccessFile来实现文件的追加
JSP设计模式
JSP如何连接DB2数据库
JSP调用JavaBean在网页上动态生成柱状图
JSP技巧:发送动态图像
JSP实现论坛树型结构的具体算法
一个用JSP实现的分页的类及调用方法
在JSP中使用JavaMail
JSP的九种基本内置组件简介
Applet数字签名,授予访问本地资源
如何入侵基于JSP的网站
JSP/Servlet构建三层管理信息系统
J2ME中实现可伸展目录树TreeList

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 84 ::
收藏到网摘: n/a

在缺省情况下,一个容器中只为每个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定义。