`
cnhawkwing
  • 浏览: 66994 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JSP页面和Servlet的性能优化技术

阅读更多

 

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

技术1:在HttpServlet init()方法中缓存数据

服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。为了提高性能,在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了javax.sql.DataSource接口的JDBC连接池。DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作,而且严重影响了应用的性能。Servlet的init()方法可以用于获取DataSource并缓存它以便之后的重用:

public class ControllerServlet extends HttpServlet
{
private javax.sql.DataSource testDS = null;

public void init(ServletConfig config) throws ServletException
{
super.init(config);
Context ctx = null;
try
{
ctx = new InitialContext();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingException ne)
{
ne.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}

public javax.sql.DataSource getTestDS()
{
return testDS;
}
...
...
}



技术2:禁用servlet和Jsp的自动装载功能

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

技术3:控制HttpSession

许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用,Java servlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session,但是使用它需要成本。无论何时HttpSession被使用和重写,它都由servlet读取。你可以通过使用下面的技术来提高性能:

在JSP页面中不要创建默认的HttpSession:默认情况下,JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession,为了节省性能开销,使用下边的页面指令可以避免自动创建HttpSession对象:


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

用完后释放HttpSession:当不在使用HttpSession时,使用HttpSession.invalidate()方法使sesion失效。

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

技术4:使用gzip压缩

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

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{

OutputStream out = null

// Check the Accepting-Encoding header from the HTTP request.
// If the header includes gzip, choose GZIP.
// If the header includes compress, choose ZIP.
// Otherwise choose no compression.

String encoding = request.getHeader("Accept-Encoding");

if (encoding != null && encoding.indexOf("gzip") != -1)
{
response.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(response.getOutputStream());
}
else if (encoding != null && encoding.indexOf("compress") != -1)
{
response.setHeader("Content-Encoding" , "compress");
out = new ZIPOutputStream(response.getOutputStream());
}
else
{
out = response.getOutputStream();

}
...
...



}

技术5:不要使用SingleThreadModel

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

技术6:使用线程池

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

技术7:选择正确的包括机制

在JSP页面中,有两中方式可以包括文件:包括指令()和包括动作()。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。

技术8:在useBean动作中使用合适的范围

使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用标签可以嵌入到JSP页面中。语法如下:

<jsp:useBean id="name" scope="page|request|session|application" class=
"package.className" type="typeName">
</jsp:useBean>



scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。

例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。

杂项技术

避免字符串连接:由于String对象是不可变对象,使用“+”操作符将会导致创建大量的零时对象。你使用的“+”越多,产出的零时对象就越多,这将影响性能。当你需要连接字符串时,使用StringBuffer替代“+”操作。

避免使用System.out.println:System.out.println同步处理磁盘输入/输出,这大大地降低了系统吞吐量。尽可能地避免使用System.out.println。尽管有很多成熟的调试工具可以用,但有时System.out.println为了跟踪、或调试的情况下依然很有用。你应该配置System.out.println仅在错误和调试阶段打开它。使用final Boolean型的变量,当配置成false时,在编译阶段完成优化检查和执行跟踪输出。

ServletOutputStream 与 PrintWriter比较:由于字符输出流和把数据编码成字节,使用PrintWriter引入了小的性能开销。因此,PrintWriter应该用在所有的字符集都正确地转换做完之后。另一方面,当你知道你的servlet仅返回二进制数据,使用ServletOutputStream,因为servlet容器不编码二进制数据,这样你就能消除字符集转换开销。

总结

本文的目的是展示给你一些实践的和已经证实的用于提高servlet和JSP性能的性能优化技术,这些将提高你的J2EE应用的整体性能。下一步应该观察其他相关技术的性能调整,如EJB、JMS和JDBC等。

分享到:
评论

相关推荐

    Servlet Jsp 技术概述

    1. **生命周期**:Servlet和JSP都有初始化、服务和销毁三个阶段,理解每个阶段的作用和触发条件对于优化性能至关重要。 2. **转发与重定向**:在处理请求时,你需要了解RequestDispatcher的forward()和sendRedirect...

    Servlet和JSP技术简述(英文翻译)

    【Servlet和JSP技术概述】 Servlet和JSP(JavaServer Pages)是Java平台上的两种核心技术,主要用于构建动态Web应用程序。它们在Web开发中的角色至关重要,尤其在处理客户端请求和生成响应方面。以下是对Servlet和...

    将JSP代码转为Servlet

    将JSP代码转换为Servlet是一种优化Web应用性能和结构的方式,尤其在大型项目中。使用自动化工具可以简化这个过程,但同时也需要权衡代码的可读性和维护性。对于初学者来说,了解这种转换有助于深入理解Java Web的...

    JSPServlet技术在管理信息系统中的应用.pdf

    3. **视图层**:JSP页面负责将业务逻辑层处理后的数据呈现给用户,形成直观的用户界面。 4. **通信层**:通过HTTP协议(或其变体如HTTPS)实现服务器与客户端之间的数据传输。 #### 四、技术优势与实现框架 JSP...

    基于jsp,servlet技术开发的博客系统

    8. 性能优化:对于大型博客系统,可能需要考虑性能优化,如使用缓存技术(如Redis)来减少数据库访问,或者使用负载均衡和集群来分散服务器压力。 9. 安全性:防止SQL注入、跨站脚本攻击(XSS)和其他网络安全威胁...

    使用JSP/Servlet/Ajax技术开发新闻发布系统(5~6)

    6. **测试与优化**:进行功能测试和性能测试,优化用户体验,如减少页面加载时间,优化数据库查询性能。 **关键技术点** - JSP指令和动作标签:`&lt;jsp:include&gt;`、`&lt;jsp:forward&gt;`、`&lt;jsp:useBean&gt;`等,用于页面控制...

    JSP Servlet性能分析.rar

    本资料“JSP Servlet性能分析”深入探讨了这两者在性能方面的考量,帮助开发者理解如何优化Web应用的性能。 1. JSP与Servlet的基本概念: - JSP:是一种视图技术,将HTML代码与Java代码分离,使得前端开发者可以...

    经典的jsp+servlet项目

    在"easybuy"这个项目中,我们可以看到它可能包含了一系列与电子商务相关的JSP页面(如index.jsp、product.jsp、cart.jsp等)、Servlet类(如LoginServlet、SearchServlet等)以及配置文件(web.xml)等,这些共同...

    jsp-api.jar和servlet-api.jar

    2. **生命周期** - 了解Servlet和JSP的生命周期对于优化性能至关重要。Servlet实例化、初始化、服务和销毁的过程,以及JSP转化为Servlet的过程。 3. **部署描述符** - web.xml文件是Web应用的部署描述符,定义了...

    jsp+servlet 分页

    在提供的文件列表`PageT`中,可能包含了实现分页功能的示例代码,包括JSP页面和Servlet类。通过分析和学习这些代码,可以更深入地理解如何在实际项目中实现分页功能。 总的来说,"jsp+servlet 分页"是Java Web开发...

    使用JSP/Servlet技术开发新闻发布系统.7z

    这个教学案例不仅涵盖了基本的JSP和Servlet知识,还涉及到了MVC设计模式、数据库操作、Web应用安全和性能优化等多个方面,对于学习和提升Web开发技能具有很高的价值。通过实践这个案例,学员能够深入理解Web开发流程...

    jsp+servlet实现图片上传

    一旦文件成功上传,Servlet可以返回一个确认消息,这可以通过设置HTTP响应的状态码和消息,或者将结果传递回JSP页面显示。 通过以上步骤,我们可以创建一个简单的图片上传系统。在这个过程中,JSP和Servlet协同...

    使用JSP和Servlet技术构建BBS论坛系统

    综上所述,构建BBS论坛系统涉及到众多技术细节,从网站结构的设计到性能优化,再到安全性考虑,都需要开发者具备扎实的JSP和Servlet基础,以及良好的系统设计思维。通过不断学习和实践,我们可以构建出高效、易用且...

    基于jsp和servlet的团购网站

    9. **性能优化**:为了提升网站性能,可能采用缓存策略(如使用Redis)、负载均衡、数据库优化(如索引、查询优化)等技术。 10. **测试与部署**:项目开发完成后,需要进行功能测试、性能测试、压力测试等,确保...

    通过servlet实现jsp分页技术

    7. **响应返回**:Servlet将处理后的JSP页面响应给客户端,用户就能看到分页显示的结果。 在实践中,为了提高代码的可复用性和可维护性,我们还可以创建一个通用的分页工具类,将上述步骤封装起来,以供各个Servlet...

    jsp+servlet+javabean学生信息管理系统

    【标题】:“jsp+servlet+javabean学生信息管理系统”是一种基于Web的教育管理软件,它结合了三种核心技术——JavaServer Pages(JSP)、Servlet和JavaBeans,用于实现对学生信息的有效管理和操作。这个系统旨在提高...

    jsp+servlet聊天源码

    【jsp+servlet聊天源码】是一个典型的Web应用程序开发示例,它结合了JavaServer Pages (JSP) 和Servlet技术来实现在线聊天功能。...同时,这也是一个实践多线程处理、异步通信和服务器性能优化的好机会。

    jsp+servlet++hibernate+购物车系统

    【标题】"jsp+servlet+hibernate+购物车系统"是一个基于Web的电商应用程序,它结合了三种核心技术:JavaServer Pages(JSP)、Servlet和Hibernate。这个系统旨在实现一个完整的购物过程,包括商品浏览、选择商品加入...

    JSP_Servlet应用程序优化的八种方法

    #### 技术4:优化JSP页面 - **避免使用过多的JSP指令**:过多的`&lt;%@ %&gt;`, `&lt;%= %&gt;`, `&lt;% %&gt;`, `&lt;jsp:include&gt;`, `&lt;jsp:useBean&gt;`等指令会增加解析JSP页面的时间。 - **使用EL表达式和JSTL标签库**:EL(Expression ...

    Jsp-Servlet-JavaBean企业事务管理系统

    在IT领域,JSP(JavaServer Pages)、Servlet和JavaBean是构建Web应用程序的三大核心技术,尤其在企业级应用开发中扮演着重要角色。本系统——"Jsp-Servlet-JavaBean企业事务管理系统"是一个基于这些技术的实践案例...

Global site tag (gtag.js) - Google Analytics