Servlet与CGI

对比 Servlt 和 CGI

java 的 servlet 实现是自己规定了一套协议,与 CGI 和 fastcgi 协议不同。
Servlet 与 CGI 的区别
对比一:当用户浏览器发出一个 Http/CGI 的请求,或者说调用一个 CGI 程序的时候,服务器端就要新启用一个进程(而且是每次都要调用),调用 CGI 程序越多(特别是访问量高的时候),就要消耗系统越多的处理时间,只剩下越来越少的系统资源,对于用户来说,只能是漫长的等待服务器端的返回页面了,这对于电子商务激烈发展的今天来说,不能不说是一种技术上的遗憾。

而 Servlet 充分发挥了服务器端的资源并高效的利用。每次调用 Servlet 时并不是新启用一个进程,而是在一个 Web 服务器的进程中共享和分离线程,而线程最大的好处在于可以共享一个数据源,使系统资源被有效利用。

对比二:传统的 CGI 程序,不具备平台无关性特征,系统环境发生变化,CGI 程序就要瘫痪,而 Servlet 具备 Java 的平台无关性,在系统开发过程中保持了系统的可扩展性、高效性。

对比三:传统技术中,一般大都为二层的系统架构,即 Web 服务器+数据库服务器,导致网站访问量大的时候,无法克服 CGI 程序与数据库建立连接时速度慢的瓶颈,从而死机、数据库死锁现象频繁发生。而 Servlet 有连接池的概念,它可以利用多线程的优点,在系统缓存中事先建立好若干与数据库的连接,到时候若想和数据库打交道可以随时跟系统”要”一个连接即可,反应速度可想而知。

Java Servlet 为什么不做成 FastCGI 模式?

1、JVM 多线程架构健壮性非常强

理论上多进程确实健壮性更强,但实际上,JVM 进程远比普通 C/C++进程坚固。

用 C/C++写程序,随便一个空指针、内存越界、内存泄漏就可能意外终止进程,更遑论很多 C/C++程序处理严重错误的方式都是很粗暴的 exit 或者 panic。

而用 Java 写代码,要想不小心终止进程很难。异常机制可以保证几乎没有任何 Java 代码能够直接干掉一个线程或进程,Java 程序的线程几乎跟普通 C/C++的进程一样脆弱/坚固。

2、Tomcat 静态文件性能并不差
别的 Servlet 容器不清楚,但是得益于独立的 connector 设计,较新版本的 Tomcat 有了 NIO、APR 等技术的加持,静态文件性能不会比 apache httpd 差到哪儿去。

“很多网站直接用 servlet 容器当 web 服务器”,因为这样很简单,而且暂时可能没遇到或不关心性能瓶颈。