关于tomcat中Servlet对象池

Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端请求tomcat会使用多线程处理,所以应该保证此Servlet对象的线程安全,多个线程不管执行顺序如何都能保证执行结果的正确性。例如刚做web应用开发时可能会犯的一个错误:在某个Servlet中使用成员变量累加去统计访问次数,这就存在线程安全问题。

为了支持一个Servlet对象对应一个线程,Servlet规范提出了一个SingleThreadModel接口,tomcat容器必须要完成的机制是:如果某个Servlet类实现了SingleThreadModel接口则要保证一个线程独占一个Servlet对象。假如线程1正在使用Servlet对象1,则线程2只能用Servlet对象2。

针对SingleThreadModel模式,tomcat的Wrapper容器使用了对象池策略,Wrapper容器会有一个Servlet堆保存若干个该Servlet对象,当需要该Servlet对象时从堆中pop一个对象,而当用完后则push回堆中。Wrapper容器中最多可以有20个该Servlet对象,例如xxxServlet类的对象池,已经有20个线程占用了20个对象,那么第21个线程执行时就会阻塞等待,直到对象池中有可用的对象才继续执行。

整个流程如下图所示,某个线程处理客户端请求,它首先尝试从Servlet对象池中获取Servlet对象,此时如果对象池有可用对象则直接返回一个对象,如果不够使用则继续实例化Servlet对象并push进对象池,但Servlet对象的总数量必须保证在20个以内,如果20个Servlet对象都被其他线程使用了,那么就必须要等到其他线程用完放回后才能获取,此时该线程会一直阻塞等待。从对象池中获取到Servlet对象后则调用Servlet对象的service方法对客户端请求进行处理,处理完后再将Servlet对象放回对象池中。

本节介绍了Servlet对象池,它是为了支持Servlet规范SingleThreadModel接口而引入的,它就是一个栈结构,需要时就pop一个对象,使用完就push回去。

时间: 2024-11-10 06:53:23

关于tomcat中Servlet对象池的相关文章

tomcat中Servlet的工作机制

在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法.对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持. 在tomcat中消息流的流转机制是通过四个不同级别的容器管道机制进行流转的,对于每个

在Tomcat中配置连接池和数据源

1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JNDI),应用程序就可以通过名字服务获得DataS

GameObjectPool——Unity中的对象池

这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Collections.Generic; //对象池 public class GameObjectPool : MonoSingleton<GameObjectPool> { /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary> priv

KBEngine中的对象池

编程中常常看到将许多东西放在资源池中,在使用的时候可以提高效率.看起来和实现一个缓存类型,虽然原理简单,但是徒手写有总觉得缺点什么,所以在此总结一下 1.对象池 template< typename T, typename THREADMUTEX = KBEngine::thread::ThreadMutexNull > class ObjectPool { public: typedef std::list<T*> OBJECTS; ObjectPool(std::string

Tomcat中的线程池StandardThreadExecutor

之所以今天讨论它,因为在motan的的NettyServer中利用它这个线程池可以作为业务线程池,它定制了一个自己的线程池.当然还是基于jdk中的ThreadExecutor中的构造方法和execute方法,然后在外边包装一层. public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,

在tomcat中配置连接池

在tomcat的conf/Catalina/localhost目录下配置项目路径,tomcat启动是会直接根据配置去加载项目. 虽然配置就一句话,但经常忘,今天记下来. 如果你的项目成名是:mypro,那你的文件命名为:mypro.xml. 文件里一句话:<Context docBase="D:\Workspaces\mypro\WebRoot" path="/mypro" reloadable="true"/> docBase是项目

Tomcat 【中配置连接池和数据源】

四.Tomcat 中配置连接池和数据源   1.DataSource接口介绍   (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JN

Tomcat如何与Servlet对象进行交互

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品.下面我们描述一下Tomcat与Servlet是如何工作的,首先看下面的时序图. 1.1.Web客户向Servlet容器(Tomcat)

干货 | Tomcat 连接数与线程池详解

前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据:然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Request和Response对象传给Engine.当Engine处理完请求后,也会通过Conn