最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > jsp教程

JSP/Servlet应用程序优化八法总结

日期:11-24    来源:网页设计秀    作者:cnwebshow.com

  你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能、高弹性的jsp页面和Servlet的性能优化技术。其意思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升J2EE的性能。这些技术的部分用于开发阶段,例如,设计和编码阶段。另一部分技术则与配置相关。Z49中国设计秀

  技术1:在HttpServletinit()方法中缓存数据Z49中国设计秀

  服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。为了提高性能,在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了javax.sql.DataSource接口的JDBC连接池。Z49中国设计秀

  DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作,而且严重影响了应用的性能。Servlet的init()方法可以用于获取DataSource并缓存它以便之后的重用:Z49中国设计秀

publicclassControllerServletextendsHttpServletZ49中国设计秀
{Z49中国设计秀
PRivatejavax.sql.DataSourcetestDS=null;Z49中国设计秀

publicvoidinit(ServletConfigconfig)throwsServletExceptionZ49中国设计秀
{Z49中国设计秀
super.init(config);Z49中国设计秀
Contextctx=null;Z49中国设计秀
tryZ49中国设计秀
{Z49中国设计秀
ctx=newInitialContext();Z49中国设计秀
testDS=(javax.sql.DataSource)ctx.lookup("jdbc/testDS");Z49中国设计秀
}Z49中国设计秀
catch(NamingExceptionne)Z49中国设计秀
{Z49中国设计秀
ne.printStackTrace();Z49中国设计秀
}Z49中国设计秀
catch(Exceptione)Z49中国设计秀
{Z49中国设计秀
e.printStackTrace();Z49中国设计秀
}Z49中国设计秀
}Z49中国设计秀

publicjavax.sql.DataSourcegetTestDS()Z49中国设计秀
{Z49中国设计秀
returntestDS;Z49中国设计秀
}Z49中国设计秀
...Z49中国设计秀
...Z49中国设计秀
}Z49中国设计秀

  技术2:禁用servlet和Jsp的自动装载功能Z49中国设计秀

  当每次修改了Servlet/JSP之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;servlet/JSP由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此,在运行环境中为了得到更好的性能,关闭servlet/JSP的自动装载功能。Z49中国设计秀

  技术3:控制HttpsessionZ49中国设计秀

  许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用,Javaservlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session,但是使用它需要成本。无论何时HttpSession被使用和重写,它都由servlet读取。你可以通过使用下面的技术来提高性能:Z49中国设计秀
l在JSP页面中不要创建默认的HttpSession:默认情况下,JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession,为了节省性能开销,使用下边的页面指令可以避免自动创建HttpSession对象:Z49中国设计秀
<%@pagesession="false"%>Z49中国设计秀

  1) 不要将大的对象图存储在HttpSession中:如果你将数据当作一个大的对象图存储在HttpSession中,应用服务器每次将不得不处理整个HttpSession对象。这将迫使Java序列化和增加计算开销。由于序列化的开销,随着存储在HttpSession对象中数据对象的增大,系统的吞吐量将会下降。Z49中国设计秀

  2) 用完后释放HttpSession:当不在使用HttpSession时,使用HttpSession.invalidate()方法使sesion失效。Z49中国设计秀

  3) 设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。Z49中国设计秀

  技术4:使用gzip压缩Z49中国设计秀

  压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(GNUzip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。Z49中国设计秀

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)Z49中国设计秀
throwsIOException,ServletExceptionZ49中国设计秀
{Z49中国设计秀

OutputStreamout=nullZ49中国设计秀

//ChecktheAccepting-EncodingheaderfromtheHTTPrequest.Z49中国设计秀
//Iftheheaderincludesgzip,chooseGZIP.Z49中国设计秀
//Iftheheaderincludescompress,chooseZIP.Z49中国设计秀
//Otherwisechoosenocompression.Z49中国设计秀

Stringencoding=request.getHeader("Accept-Encoding");Z49中国设计秀

if(encoding!=null&&encoding.indexOf("gzip")!=-1)Z49中国设计秀
{Z49中国设计秀
response.setHeader("Content-Encoding","gzip");Z49中国设计秀
out=newGZIPOutputStream(response.getOutputStream());Z49中国设计秀
}Z49中国设计秀
elseif(encoding!=null&&encoding.indexOf("compress")!=-1)Z49中国设计秀
{Z49中国设计秀
response.setHeader("Content-Encoding","compress");Z49中国设计秀
out=newZIPOutputStream(response.getOutputStream());Z49中国设计秀
}Z49中国设计秀
elseZ49中国设计秀
{Z49中国设计秀
out=response.getOutputStream();Z49中国设计秀

}Z49中国设计秀
...Z49中国设计秀
...Z49中国设计秀
}Z49中国设计秀

  技术5:不要使用SingleThreadModelZ49中国设计秀

  SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。SingleThreadModel在Servlet2.4中是不再提倡使用。Z49中国设计秀

  技术6:使用线程池Z49中国设计秀

  servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。Z49中国设计秀

  技术7:选择正确的包括机制Z49中国设计秀

  在JSP页面中,有两中方式可以包括文件:包括指令(<%@includefile="test.jsp"%>)和包括动作(<jsp:includepage="test.jsp"flush="true"/>)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此

本文引用地址:/bc/article_46730.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明