你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能、高弹性的JSP页面和Servlet的性能优化技术。其意思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升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的自动装载功能
当每次修改了Servlet/JSP之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;servlet/JSP由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此,在运行环境中为了得到更好的性能,关闭servlet/JSP的自动装载功能。
技术3:控制HttpSession
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用,Javaservlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session,但是使用它需要成本。无论何时HttpSession被使用和重写,它都由servlet读取。你可以通过使用下面的技术来提高性能:
l在JSP页面中不要创建默认的HttpSession:默认情况下,JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession,为了节省性能开销,使用下边的页面指令可以避免自动创建HttpSession对象:
<%@pagesession="false"%>
1) 不要将大的对象图存储在HttpSession中:如果你将数据当作一个大的对象图存储在HttpSession中,应用服务器每次将不得不处理整个HttpSession对象。这将迫使Java序列化和增加计算开销。由于序列化的开销,随着存储在HttpSession对象中数据对象的增大,系统的吞吐量将会下降。
2) 用完后释放HttpSession:当不在使用HttpSession时,使用HttpSession.invalidate()方法使sesion失效。
3) 设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。 网管论坛bbs_bitsCN_com
技术4:使用gzip压缩
压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(GNUzip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
OutputStreamout=null
//ChecktheAccepting-EncodingheaderfromtheHTTPrequest.
//Iftheheaderincludesgzip,chooseGZIP.
//Iftheheaderincludescompress,chooseZIP.
//Otherwisechoosenocompression.
Stringencoding=request.getHeader("Accept-Encoding");
if(encoding!=null&&encoding.indexOf("gzip")!=-1)
{
response.setHeader("Content-Encoding","gzip");
out=newGZIPOutputStream(response.getOutputStream());
}
elseif(encoding!=null&&encoding.indexOf("compress")!=-1)
{
response.setHeader("Content-Encoding","compress");
out=newZIPOutputStream(response.getOutputStream());
}
else
{
out=response.getOutputStream();
}
...
...
}
技术5:不要使用SingleThreadModel
SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。SingleThreadModel在Servlet2.4中是不再提倡使用。
技术6:使用线程池
servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。
中国网管论坛bbs.bitsCN.com
技术7:选择正确的包括机制
在JSP页面中,有两中方式可以包括文件:包括指令(<%@includefile="test.jsp"%>)和包括动作(<jsp:includepage="test.jsp"flush="true"/>)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。
技术8:在useBean动作中使用合适的范围
使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用<jsp:useBean>标签可以嵌入到JSP页面中。语法如下:
<jsp:useBeanid="name"scope="page|request|session|application"class=
"package.className"type="typeName">
</jsp:useBean>
scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。
例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
杂项技术
1) 避免字符串连接:由于String对象是不可变对象,使用“+”操作符将会导致创建大量的零时对象。你使用的“+”越多,产出的零时对象就越多,这将影响性能。当你需要连接字符串时,使用StringBuffer替代“+”操作。
2) 避免使用System.out.println:System.out.println同步处理磁盘输入/输出,这大大地降低了系统吞吐量。尽可能地避免使用System.out.println。尽管有很多成熟的调试工具可以用,但有时System.out.println为了跟踪、或调试的情况下依然很有用。你应该配置System.out.println仅在错误和调试阶段打开它。使用finalBoolean型的变量,当配置成false时,在编译阶段完成优化检查和执行跟踪输出。
3) ServletOutputStream与PrintWriter比较:由于字符输出流和把数据编码成字节,使用PrintWriter引入了小的性能开销。因此,PrintWriter应该用在所有的字符集都正确地转换做完之后。另一方面,当你知道你的servlet仅返回二进制数据,使用ServletOutputStream,因为servlet容器不编码二进制数据,这样你就能消除字符集转换开销。【转自www.bitsCN.com】
分享到:
相关推荐
Servlet是Java Web应用程序的核心组件,它们在服务器端运行,处理请求并生成响应。在新闻发布系统中,Servlet可以用来接收用户提交的数据,如新文章的标题、内容等,同时也可以执行数据库操作,如插入、更新或查询...
在IT行业中,JSP(JavaServer Pages)和Servlet是用于构建动态Web应用程序的两种核心技术,尤其在企业级应用开发中广泛应用。本项目“使用JSP/Servlet技术开发新闻发布系统”是一个典型的教学案例,旨在帮助学员...
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建Web应用程序,尤其是动态网站方面发挥着重要作用。在这个名为“jsp/servlet blog”的项目中,我们看到一个基于这两项技术的简单博客...
Servlet是Java Web应用程序的核心组件,用于接收和处理HTTP请求。在本项目中,Servlet将作为后端控制器,负责处理用户操作,如登录验证、商品搜索、添加到购物车等业务逻辑。通过定义servlet映射,我们可以将特定的...
在IT领域,基于jsp/servlet/JavaBean的网上交易系统是Web开发中的一个经典架构,尤其适用于初学者了解和学习Web应用程序的构建。这种架构利用了Java的强大功能和灵活性,以及Web开发的动态特性,实现了用户交互、...
通过以上转换,开发者可以从ASP的限制中解脱出来,利用Java的强类型、面向对象以及广泛的企业级支持,提升应用程序的稳定性和可扩展性。同时,JSP/Servlet还提供了MVC(Model-View-Controller)架构的支持,使得项目...
### JSP_Servlet应用程序优化的八种方法 #### 技术1:在`HttpServlet init()`方法中缓存数据 为了提升JSP/Servlet应用程序的性能,开发者可以在`init()`方法中缓存静态数据或执行那些成本较高的初始化操作。这是...
【JSP(JavaServer Pages)】 JSP是Java平台上的服务器端脚本...通过以上各章的学习,开发者将能够掌握使用JSP、Servlet和Ajax技术构建新闻发布系统的基本流程和关键点,实现一个功能完备、用户体验良好的动态网站。
JSPServlet技术是JavaServer Pages (JSP) 和 Servlet 的组合使用,为Web应用程序开发提供了强大的支持。JSP是一种动态网页技术标准,它允许在标准的HTML代码中嵌入Java代码片段和声明,从而使网页具有动态生成内容的...
MVC模式是一种软件设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。在BBS论坛中: 1. **模型(Model)**:负责处理业务逻辑和数据操作,如用户注册、发帖、回帖等。...
- **Hibernate**: Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过定义实体类和映射文件,可以将Java对象直接转换为数据库记录,反之亦然,减少了大量SQL代码的编写。 - ...
JSP主要用于视图层的展示,而Servlet则负责处理业务逻辑和控制流程。下面将详细阐述该项目的知识点。 1. **JSP基础**: JSP是一种动态网页技术,它允许在HTML页面中嵌入Java代码,实现了视图和逻辑的分离。在本...
这个资源包含了"restaurant"等实际项目案例,通过解决这些习题,学习者可以更好地理解和运用JSP与Servlet来开发动态Web应用程序。 JSP是Java平台上的一个标准视图技术,用于创建动态网页。它允许开发者在HTML、XML...
【B2C电子商城 购物车 jsp/servlet】是一个典型的Web应用程序项目,它主要使用JavaServer Pages(JSP)和Servlet技术构建。在本文中,我们将深入探讨这个项目涉及的关键知识点,以及如何利用这些技术实现一个功能...
在JSP/Servlet应用中,控制器Servlet接收请求,处理业务逻辑,然后将结果传递给JSP页面进行展示。这样可以分离业务逻辑和展示逻辑,使代码更加清晰和易于维护。 在这个项目中,学习者会实践以上知识,实现新闻主题...
在开发基于JSP/Servlet/JavaBean的网上交易系统,如网上书店,这些技术的结合提供了构建高效、可扩展的Web应用程序的框架。这个系统的核心是实现购物车功能,这在电子商务网站中至关重要,因为它允许用户选择他们想...
- 创建和运行简单的JSP和Servlet程序。 - 理解JSP的脚本元素和指令,以及Servlet的生命周期。 - 掌握HTTP请求和响应的处理。 - 实现用户会话管理,以及在Web应用中的数据共享。 - 应用MVC模式设计Web应用。 总之,...
在IT行业中,开发Web应用程序时,MVC(Model-View-Controller)模式是一种广泛采用的设计模式。本项目"Jbbs"是一个基于JSP和Servlet技术构建的BBS(论坛)系统,严格遵循了MVC模式进行开发。下面我们将详细探讨这一...
在IT行业中,JSP(JavaServer Pages)和Servlet是用于构建动态web应用程序的两种核心技术。JSP主要用于视图层,而Servlet则负责处理业务逻辑。购物车功能是电商网站的核心部分,它涉及到用户选择商品、数量调整、...