版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者。
https://blog.youkuaiyun.com/weixin_43453386/article/details/89673529
一、Servlet 与 CGI 的比较
1、线程数
调用一个CGI程序的时候,服务器端就要新启用一个进程 (而且是每次都要调用),调用CGI程序越多(特别是访问量高的时候),就要消耗系统越多的处理时间,只剩下越来越少的系统资源,对于用户来说,只能是漫长的等待服务器端的返回页面了,这对于电子商务激烈发展的今天来说,不能不说是一种技术上的遗憾。
Servlet充分发挥了服务器端的资源并高效的利用。每次调用Servlet时并不是新启用一个进程 ,而是在一个Web服务器的进程敏感词享和分离线程,而线程最大的好处在于可以共享一个数据源,使系统资源被有效利用。
2、平台无关性
CGI不具备平台无关性特征,系统环境发生变化,CGI程序就要瘫痪
Servlet具备Java的平台无关性,在系统开发过程中保持了系统的可扩展性、高效性。
3、数据库连接池
传统技术中,一般大都为二层的系统架构,即Web服务器+数据库服务器,导致网站访问量大的时候,无法克服CGI程序与数据库建立连接时速度慢的瓶颈,从而死机、数据库死锁现象频繁发生。
Servlet有连接池的概念,它可以利用多线程的优点,在系统缓存中事先建立好若干与数据库的连接,到时候若想和数据库打交道可以随时跟系统"要"一个连接即可,反应速度可想而知。
二、Servlet的生命周期
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
1、加载
容器通过类加载器使用servlet类对应的文件加载servlet
2、创建
通过调用servlet构造函数创建一个servlet对象
3、初始化
调用init方法初始化
4、处理客户请求
每当有一个客户请求,容器会创建一个线程来处理客户请求
5、卸载
调用destroy方法让servlet自己释放其占用的资源
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。
最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。