单例servlet

来源:互联网 发布:黑色沙漠捏脸数据放哪 编辑:程序博客网 时间:2024/06/13 03:48

请问一下,听说服务器启动时会初始化Servlet,在关闭服务器时Servlet,那么我想问一下,一个应用程序有那么多Servlet,是不是每个Servlet都只有一个实例呢?


1.多线程,存在线程安全

2.

AServlet extends HttpServlet{} 
BServlet extends HttpServlet{} 

这两个是不同的servlet,当然是两个。

他们的意思是对于不同用户的相同请求,是同一个servlet处理的

3.

每个servletClass都有可能拥有至多一个实例。
AServlet extends HttpServlet{} 
BServlet extends HttpServlet{} 
两个不同的servletClass将有如下几种可能
S = "servlet容器中的实例" = {(null,null),(1个AServlet实例,null),(1个BServlet实例,null),(1个AServlet实例,1个BServlet实例)}

4.对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给该方法。如此重复以上的循环,但无需再调用init()方法。因为,一般Servlet只初始化一次(只有一个实例),而当Server不再需要Servlet时(如异常或Server关闭),Server将调用Servlet的destroy()方法。


5.这个生命周期是相当好理解的。唯一的一点,就是,为什么Servlet只有一个实例?

       出于性能的考虑:特别的对于门户网站而言,每一个Servlet在每一秒内的并发访问量都可以是成千上万的。在一个面向模块化开发的现在,常常一个点击操作就被定义为一个Servlet的实现,而如果Servlet的每一次被访问,都创建一个新的实例的话,服务器的可用资源消耗量将是一个相当重要的问题。退一步,一般Servlet的访问是很快的,每一个实例被快速的创建,又被快速的回收,GC的回收速度也跟不上,频繁的内存操作也将可能带来次生的问题。所以,Servlet的“单一实例化”是一个很重要的策略。但,它如何解决并发的问题呢?
       其实,服务器容器会为每一个Servlet维护一个连接池,是c3p0或dbcp,都实现了DataSource,是其实现类。在编程实现上可理解为一个Application级别的Vector(自身线程安全的集合类),里面装载相当数量的Connection。每一个HTTP请求到来时,将分配一个Connection去响应请求。并在结束响应后,把Connection放回线程池。而如果当前可用Connection小于一个标准数量值,便自动添加新的Connection到Vector中。

      所以,除了Servlet文件的编写及相关的部署外,所有的其他操作其实都交付给了服务器容器来进行管理。