你的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" %>)和包括动作(< jsp:include page="test.jsp" flush="true" />)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。

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

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

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

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

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

JSP和Servlet性能优化经验谈的更多相关文章

  1. 对JSP和Servlet性能优化,提升执行效率

    你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文 ...

  2. U3D手游《苍穹变》性能优化经验谈

    4月11日,由unity公司举办的Unite 2016大会在上海正式举行,在4月12日的案例分享专场会议上,天神互动U3D高级开发工程师康凯以手游<苍穹变>为例讲述了3DMMOARPG游戏 ...

  3. JSP Servlet性能分析

    JSP Servlet性能分析:http://www.docin.com/p-757790851.html

  4. Java 性能优化技巧集锦

    摘要: =================================== 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常 ...

  5. tomcat之性能优化

    tomcat是我们常用的web容器,它的性能高低直接影响到应用对外提供服务的能力和用户的体验,所以tomcat的优化至关重要.对于单台tomcat服务器而言,优化主要是两方面:内存优化和配置优化(例如 ...

  6. Tomcat性能优化(转载)

    出处:微信订阅号GitChat精品课程 — Tomcat性能优化 Tomcat 简单介绍 Sun 公司创建了第一个 Servlet 容器,即 Java Web Server,但 JWS 只是为了演示 ...

  7. 《Java性能优化权威指南》

    <Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...

  8. Tomcat安全配置与性能优化

    Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户喜爱.目前,很 ...

  9. Weblogic性能优化(图解)

    分类:Weblogic (2034) (1) 若是觉得对您有一丢丢的帮助,烦请顶一下哦,激励我码出更多的帖子,^_^谢谢! 1.数据源性能优化 1.1连接池参数配置 登录weblogic控制台,占击“ ...

随机推荐

  1. Android studio 构建太慢

    /*********************************************************************************** * Android studi ...

  2. HihoCoder1532 : 最美和弦(DP简单优化)

    描述 某个夜晚,Bob将他弹奏的钢琴曲录下来发给Jack,Jack感动之余决定用吉他为他伴奏. 我们可以用一个整数表示一个音符的音高,并可认为Bob弹奏的曲子是由3N个整数构成的一个序列.其中每个整数 ...

  3. MFC之document与view实践总结

    Document/View是MFC的基石,负责程序数据的管理和显示,Doculent和Viewd的关系有一档一视,一档多视和多档多视,下面将分别对实现过程中的重点知识进行总结. 1. 视图的同步更新 ...

  4. 廖雪峰ES6的箭头函数

    http://www.liaoxuefeng.com/ wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014385659690576 ...

  5. Spring中Bean获取IOC容器服务的方法

    Spring 依赖注入可以让所有的Bean对其IOC容器的存在是没有意识的,甚至可以将容器换成其它的.但实际开发中如果某个Bean对象要用到Spring 容器本身的功能资源,需要意识到IOC容器的存在 ...

  6. Android Studio手动下载配置Gradle的方法

    1 问题 (1) android sutdio第一次打开一个工程巨慢怎么办? (2) 手动配置Gradle Home为什么总是无效? (3) 明明已经下载了Gradle,配置了gradle home, ...

  7. ul下的li浮动,如何是ul有li的高度

    此时ul展示的界面为: ①给ul加上一个样式,display:inline-block; <html> <head> <title>float</title& ...

  8. 伪元素 first-letter

    ::after, ::before, ::backdrop, ::first-letter,::first-line, ::selection(css3)是伪元素, :active, :focus,  ...

  9. Swift3.0 UITextView写反馈界面

    效果图 适配用的 SnapKit 使用介绍:  http://www.hangge.com/blog/cache/detail_1097.html private func creationTextV ...

  10. python __builtins__ credits类 (15)

    15.'credits', 信用 class _Printer(builtins.object) | interactive prompt objects for printing the licen ...