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

JSP
Java 创建cookie和删除cookie
jsp 从web.xml读取连接数据库的参数
jsp 不支持EL表达式,解决办法
jsp 获取客户端的浏览器和操作系统信息
struts2 session 解读
struts2 spring整合fieldError问题
jsp 生成验证码代码
搭建java WEB开发环境和应用
JSP 自定义标签
Java 区分文本中的中英文字符函数
通用JSP页面 jsp入门级文章
jsp struts1 标签实例详解
一个jdbc 测试程序代码
SSH整合中 hibernate托管给Spring得到SessionFactory
jsp SmartUpload 实现上传功能代码
jsp Unsupported encoding: gb2312 错误原因
java Struts2 在拦截器里的跳转问题
jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
Java 项目生成静态页面的代码
jdk与jre的区别 很形象,很清晰,通俗易懂

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 123 ::
收藏到网摘: 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定义。