2009年5月4日星期一

JSP/Servlet应用程序优化八法

你的J2EE应用是不是运行的很慢?它们能不能接受住不断上升的访问量?本文讲述了开发高性能、高弹性的JSP(SUN企业级应用的首选)页面和SERVLET的性能优化技术。其意思是建立尽可能快的并能顺应数量增长的用户及其请求。在本文中,我将带领你进修已经实践和得到证实的性能调整技术,它将大大地提高你的SERVLET和JSP(SUN企业级应用的首选)页面的性能,进而提升J2EE的性能。这些技术的部分用于开发阶段,例如,设计和编码阶段。另一部分技术则与配置相关。
技术1:在HTTPSERVLETINIT()方法中缓存数据
服务器会在创建SERVLET实例之后和SERVLET处理任何请求之前调用SERVLET的INIT()方法。该方法在SERVLET的生命周期中仅调用一次。为了提高性能,在INIT()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了JAVAX.SQL.DATASOURCE接口的JDBC连接池。
DATASOURCE从JNDI树中获得。每调用一次SQL就要使用JNDI查找DATASOURCE是非常昂贵的工作,而且严重影响了应用的性能。SERVLET的INIT()方法可以用于获取DATASOURCE并缓存它以便之后的重用:
PUBLICCLASSCONTROLLERSERVLETEXTENDSHTTPSERVLET

PRIVATEJAVAX.SQL.DATASOURCETESTDS=NULL;
PUBLICVOIDINIT(SERVLETCONFIGCONFIG)THROWSSERVLETEXCEPTION

SUPER.INIT(CONFIG);
CONTEXTCTX=NULL;
TRY

CTX=NEWINITIALCONTEXT();
TESTDS=(JAVAX.SQL.DATASOURCE)CTX.LOOKUP("JDBC/TESTDS");

CATCH(NAMINGEXCEPTIONNE)

NE.PRINTSTACKTRACE();

CATCH(EXCEPTIONE)

E.PRINTSTACKTRACE();


PUBLICJAVAX.SQL.DATASOURCEGETTESTDS()

RETURNTESTDS;

...
...

技术2:禁用SERVLET和JSP(SUN企业级应用的首选)的自动装载功能
当每次修改了SERVLET/JSP(SUN企业级应用的首选)之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;SERVLET/JSP(SUN企业级应用的首选)由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突景象。因此,在运行环境中为了得到更好的性能,关闭SERVLET/JSP(SUN企业级应用的首选)的自动装载功能。
技术3:控制HTTPSESSION
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于WEB的应用需要负责维护这样一个叫做SESSION的状态。为了支持必须维护状态的应用,JAVASERVLET技术提供了管理SESSION和允许多种机制实现SESSION的API。HTTPSESSION对象扮演了SESSION,但是使用它需要成本。无论何时HTTPSESSION被使用和重写,它都由SERVLET读取。你可以通过使用下面的技术来提高性能:
L在JSP(SUN企业级应用的首选)页面中不要创建默认的HTTPSESSION:默认状况下,JSP(SUN企业级应用的首选)页面创建HTTPSESSION。如果你在JSP(SUN企业级应用的首选)页面中不用HTTPSESSION,为了节省性能开销,使用下边的页面指令可以避免自动创建HTTPSESSION对象:
<%@PAGESESSION="FALSE"%>
1)不要将大的对象图存储在HTTPSESSION中:如果你将数据当作一个大的对象图存储在HTTPSESSION中,应用服务器每次将不得不处理整个HTTPSESSION对象。这将迫使JAVA序列化和增加计算开销。由于序列化的开销,随着存储在HTTPSESSION对象中数据对象的增大,系统的吞吐量将会下降。
2)用完后释放HTTPSESSION:当不在使用HTTPSESSION时,使用HTTPSESSION.INVALIDATE()方法使SESION失效。

没有评论:

发表评论