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

Servlet、Jsp性能优化

阅读更多
  你的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对象:

  
<%@ page session="false"%>


  # 不要将大的对象图存储在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页面中,有两中方式可以包括文件:包括指令(<%@ include file="test.jsp" %>)和包括动作()。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。

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

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

  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等
分享到:
评论
1 楼 魔力猫咪 2008-01-30  
虽然想说很不错。不过这篇文章实在太老了。请在转载的时候写清楚是哪年写的。

相关推荐

    毕业设计大作业基于的JavaBean+Servlet+jsp的网上购物系统毕业设计源码.zip

    毕业设计大作业基于的JavaBean+Servlet+jsp的网上购物系统毕业设计源码.zip 该系统是对我们原有JAVA大作业进行的扩展,应用到持久化管理、模版管理和视图管理等一些模式。 需求规定 a. 系统功能:采购图书 b.系统性能...

    JSP速度优化七种方法

    调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强。而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势。在本文中,我将通过一些实际例子和配置方法使得你的应用程序...

    JSP/Servlet应用程序优化八法

    本文讲述了开发高性能、高弹性的JSP页面和Servlet的性能优化技术。其意思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet...

    Java优化编程(第2版)

    第7章 jsp与servlet性能优化 7.1 提升jsp应用性能 7.1.1 优化jspinit()方法 7.1.2 通过优化_jspservice()方法提高系统性能 7.1.3 jsp高级知识 7.2 提升servlet应用性能 7.2.1 提高servlet应用性能的七个方法 7.2.2 ...

    Java项目源码之网上购物系统的实现(JavaBean+Servlet+jsp).zip

    性能优化: 数据库优化:合理设计数据库表结构,添加索引以提高查询效率。 页面缓存:利用页面缓存技术提高页面加载速度,减轻服务器压力。 网上购物系统的实现旨在为用户提供便捷、安全的在线购物体验,帮助用户...

    JSP开发技术大全 JSP

    分别介绍了JSP基础、环境搭建和开发工具、Java语言基础、JSP语法、JSP内建对象、JavaBean技术、Servlet技术、JSP经典设计模式、数据库的安装与创建、数据库访问技术、SQL语句在JSP中的应用、高性能数据处理技术、...

    JSP开发技术大全 源码

    分别介绍了JSP基础、环境搭建和开发工具、Java语言基础、JSP语法、JSP内建对象、JavaBean技术、Servlet技术、JSP经典设计模式、数据库的安装与创建、数据库访问技术、SQL语句在JSP中的应用、高性能数据处理技术、...

    Tomcat性能优化

    由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了...

    Java程序员最新简历模板,熟悉Struts2,Hibernate,Spring等框架,精通Servlet,JSP,JSTL等

    对网站的性能优化,安全机制也有一定的了解。 我曾参与过多个公司项目的开发,包括: 公司内部办公自动化系统,负责用户登录,权限管理模块的开发。 公司产品在线商城,负责产品展示,购物车,订单管理模块的开发。 公司官网...

    JSPMVC-Master

    6. 进行性能优化,如缓存静态资源、合理使用数据库连接池等。 源码二: **项目简介:** 使用Struts和Hibernate框架实现MVC架构。 **优化建议:** 1. 使用Struts框架来管理请求和响应,实现前端与后台业务逻辑的分离...

    基于servlet+jsp+mysql的图书馆管理系统.zip

    performance_schema:自MySQL 5.5版本引入,用于收集服务器性能数据,帮助诊断和优化系统性能。 test(非必要):默认提供的测试数据库,通常用于学习和实验,生产环境中可考虑删除。 sys(自MySQL 5.7版本):...

    封装好直接使用的jsp分页插件

    java web应用分页组件,可适用于jsp+servlet或s2sh,配置非常简单,引入二行代码即可,内置详细的操作配置文档和jar包及实例文件,未考虑性能优化,对性能要求很高的高手请自行测试或绕行

    基于servlet+jsp+mysql+MVC模式的学生选课管理系统.zip

    performance_schema:自MySQL 5.5版本引入,用于收集服务器性能数据,帮助诊断和优化系统性能。 test(非必要):默认提供的测试数据库,通常用于学习和实验,生产环境中可考虑删除。 sys(自MySQL 5.7版本):...

    java_jsp项目源码_乐趣大型购物系统 v1.1(+servlet+mysql).rar

    乐趣大型购物系统 v1.1 是一个基于 Java JSP、Servlet 和 MySQL 技术的先进电子商务平台。该系统旨在为企业和用户提供一个高效、稳定且安全的在线购物环境。它支持多种商品类型,包括实体商品和数字产品,满足了现代...

    基于servlet+jsp+mysql做的一个简易的网上书店项目源码.zip

    performance_schema:自MySQL 5.5版本引入,用于收集服务器性能数据,帮助诊断和优化系统性能。 test(非必要):默认提供的测试数据库,通常用于学习和实验,生产环境中可考虑删除。 sys(自MySQL 5.7版本):...

    java优化

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

    源码基于JSP的网上书店系统(论文+jsp源程序).rar

    此外,论文还可能包含系统性能优化、用户体验提升等方面的讨论。至于JSP源程序,它可能是使用传统的MVC模式编写,其中涉及的技术栈可能包括JSP, Servlet, JavaBean, JDBC以及可能的框架如Struts或Spring。源代码将...

    基于Jsp+Servlet+MySQL的会员管理系统.zip

    performance_schema:自MySQL 5.5版本引入,用于收集服务器性能数据,帮助诊断和优化系统性能。 test(非必要):默认提供的测试数据库,通常用于学习和实验,生产环境中可考虑删除。 sys(自MySQL 5.7版本):...

    Java优化编程(pdf)

    一本经典的关于java优化的书。讲解了java,jsp,servlet,jdbc的性能优化。

    毕设课设-java共享网盘jsp+servlet文件管理系统.zip

    笔记资料:整理了Java毕业设计中常见的问题和解决方案,包括数据库设计、界面美化、性能优化等方面的技巧。这些笔记资料均由经验丰富的程序员撰写,可为您提供宝贵的经验分享和指导。 视频教程:为了帮助您更好地...

Global site tag (gtag.js) - Google Analytics