`
windelk
  • 浏览: 15314 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

[转载][优化]Servlet应用程序优化的八种方法

阅读更多
 
发布时间:2007.05.21 05:26     来源:赛迪网技术社区    作者:dxaw

你 的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的超时 值设置的尽可能低。

 

技术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引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线 程的最大数和增长数,可以创建更多的线程。

 

技术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容器不编码二进制数据,这样你就能消除字符集转换开销。

分享到:
评论

相关推荐

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

    ### JSP_Servlet应用程序优化的八种方法 #### 技术1:在`HttpServlet init()`方法中缓存数据 为了提升JSP/Servlet应用程序的性能,开发者可以在`init()`方法中缓存静态数据或执行那些成本较高的初始化操作。这是...

    servlet程序设计引导

    **Servlet** 是一种服务器端的应用程序接口(API),主要用于构建动态Web应用。它是由Java Servlet API定义的一种规范,允许开发者创建高性能、可扩展的模块化Java Web应用程序。Servlet可以响应HTTP请求,处理...

    Java Servlet应用程序接口查询Java.Servlet.API和SWT 应用程序接口查询SWT_API.rar

    Java Servlet应用程序接口(Java.Servlet.API)是Java服务器端编程的核心组件,主要用于构建动态Web应用程序。它定义了一系列的类和接口,使得开发人员可以编写能够处理HTTP请求并返回响应的Servlets。Servlet API...

    Servlet的应用与配置

    Servlet 是一种基于 Java 语言的服务器端编程技术,用于开发动态 Web 应用程序。Servlet 是一种特殊类型的 Java 类,继承自 javax.servlet.Servlet 接口,该接口定义了 Servlet 的生命周期和行为。 二、Servlet ...

    如何运行Servlet程序

    Servlet 程序的运行方法和开发过程 Servlet 程序是一种基于 Java 语言的 Web 应用程序,用于处理 HTTP 请求并返回响应结果。在本文中,我们将详细介绍如何运行 Servlet 程序,包括 Servlet 的开发过程、Servlet ...

    servlet学习demo程序

    Servlet是Java Web开发中的核心组件,它是一种服务器端的Java应用程序,主要用于处理HTTP请求并生成动态响应。在本文中,我们将深入探讨Servlet的学习路径、重要概念以及如何在Eclipse环境中进行开发。 首先,...

    servlet的三种方法的实现

    在Java Web开发中,Servlet是用于处理HTTP请求的核心组件,它允许我们扩展服务器的功能,接收并响应客户端的请求。...通过不断的实践和学习,我们可以更好地利用Servlet来构建高效、稳定的Web应用程序。

    用于servlet程序的开发的servlet-jar包

    Servlet是Java平台上的一个核心组件,它允许开发者创建动态web应用程序。Servlet API是Java Servlet规范的一部分,它定义了服务器端程序如何与HTTP协议交互以及如何处理来自web客户端的请求并返回响应。`servlet.jar...

    servlet登录小程序

    在这个"Servlet登录小程序"中,我们将探讨如何利用Servlet技术构建一个简单的用户登录系统。在Servlet中,我们通常会涉及以下知识点: 1. **Servlet生命周期**:Servlet的生命周期包括加载、初始化、服务、销毁四个...

    最简单的SERVLET应用DEMO下载

    Servlet是Java平台上的一个核心技术,它用于构建动态web应用程序。Servlet是一个Java类,它可以接收并响应来自Web客户端(如浏览器)的请求。在本"最简单的Servlet应用DEMO下载"中,我们将深入理解Servlet的基本概念...

    java Java Servlet小程序

    Java Servlet是一种Java编程技术,用于开发可扩展的Web应用程序。它是Java EE(企业版)平台的一部分,主要用于服务器端,处理HTTP请求并返回响应。Servlet API提供了与Web服务器交互的接口和类,允许开发者创建动态...

    JSP/Servlet应用程序优化八法

    【JSP/Servlet应用程序优化八法】 在J2EE应用程序中,JSP和Servlet的性能优化至关重要,因为它们直接影响到应用的响应速度和系统资源的利用率。以下是一些经过实践验证的优化技术,旨在提高JSP和Servlet的性能,...

    Servlet实验报告.pdf

    本实验报告的主要目的是掌握 Servlet 应用,熟悉 web 开发的 MVC 模式,了解 servlet 的工作流程和作用,并掌握 servlet 的方法 init()、destory()、doGet()、doPost()。 一、实验目的 1. 掌握 Servlet 应用,熟悉...

    servlet小程序-选课

    Servlet小程序是一种基于Java技术的服务器端编程模型,主要用于构建动态Web应用程序。在本案例中,"servlet小程序-选课"是一个专为初学者设计的简单应用,它可能用于模拟在线选课系统的基本功能。 首先,我们需要...

    java servlet 微信点餐小程序

    【Java Servlet 微信点餐小程序】是一种基于Java技术实现的微信端餐饮服务应用,它利用Servlet技术处理来自微信小程序的请求,同时结合MySQL数据库存储和管理数据。在这个项目中,微信小程序作为用户界面,提供友好...

    java servlet 旅游推荐微信小程序

    【Java Servlet 旅游推荐微信小程序】是基于Java后端技术和微信小程序前端开发的一款应用,它旨在为用户提供个性化的旅游景点推荐服务。这个项目涉及到的主要技术栈包括Java Servlet、MySQL数据库和微信小程序开发。...

    servlet高级应用

    在"Servlet高级应用"这个主题中,我们将深入探讨Servlet的一些高级特性和实践技巧,这些内容将帮助开发者更好地构建高效、可扩展的Web应用程序。 1. **生命周期管理**: Servlet的生命周期包括初始化、服务和销毁...

    servlet写的聊天程序

    在Web应用程序中,Servlet扮演着服务器端处理程序的角色,接收并响应来自客户端(如浏览器)的请求。Servlet生命周期包括加载、初始化、服务、销毁四个阶段。在这个聊天程序中,Servlet可能是用来接收和发送聊天消息...

    JSP与Servlet程序设计实践教程.pdf

    - **性能优化**: 讨论如何提高JSP和Servlet应用程序的性能,如减少数据库访问次数、使用缓存机制等。 - **安全加固**: 分析常见的安全漏洞,如SQL注入、XSS攻击等,并提供相应的防范措施。 - **错误处理**: 探讨如何...

    linux下部署tomcat应用程序和基本优化原则

    Linux 下 Tomcat 应用程序的部署和基本优化原则 Tomcat 是一个基于 Java 的开源 Web 应用服务器,广泛应用于企业级 Web 应用程序中。部署 Tomcat 应用程序需要了解 Linux 环境和 Tomcat 的配置文件。下面将详细介绍...

Global site tag (gtag.js) - Google Analytics