`
逆风的香1314
  • 浏览: 1432165 次
  • 性别: 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对象:

以下是引用片段:
< %@ 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应用程序优化八法

    【JSP/Servlet应用程序优化八法】 在J2EE应用程序中,JSP和Servlet...通过上述优化技术,开发者可以有效地提升JSP/Servlet应用程序的性能,使其能够更好地应对高访问量和并发需求,从而提供更高效、更稳定的J2EE服务。

    JSP学习课件ppt

    5. **执行性能表现**:JSP在服务器端被编译为Servlet,执行效率较高。 JSP的运行模型分为以下几个步骤: 1. **客户端请求**:用户通过浏览器向服务器发送HTTP请求。 2. **JSP容器处理**:服务器上的JSP容器(如...

    JSP 分栏应用实例

    在本文中,我们将深入探讨JSP(JavaServer Pages)中的分栏应用实例,这是一个非常实用的技术,对于...此外,不断实践和学习新的前端框架和技术,如Vue.js或React.js,可以帮助你构建更加现代、高性能的Web应用程序。

    jsp云商城开源版

    现代前端框架如React、Vue或Angular也可能被用来提升交互性和性能。 8. **安全机制**:在电商系统中,用户隐私和交易安全是核心问题。开发者需要了解如何防止SQL注入、XSS攻击、CSRF攻击等,同时确保支付环节的安全...

    JSP+MYSQL能飞网络办公OA系统.rar

    MySQL是一种流行的开源关系型数据库管理系统,以其高性能、高可靠性和易于使用而闻名。在OA系统中,MySQL用于存储用户信息、权限设置、工作流程、文档数据等核心内容。其SQL查询语言使得数据操作简洁高效,且支持...

    电信计费系统完整源码JSP

    - 高并发处理:电信计费系统面临海量用户和频繁的交易,如何优化性能和扩展性是重要课题。 - 安全性:防止非法访问和篡改计费数据,确保用户信息安全。 - 云计算集成:随着云技术的发展,计费系统可能需要与云平台...

    Hteml5 + CSS3 + JSP API帮助文档(最新版本)

    通过Servlet和Filter接口,开发者还可以实现更高级的功能,如URL重写、安全控制和性能优化。 “CSS3.0(飘零雾雨版).chm”可能是关于CSS3的一个详细教程,包含了各种新特性的实践示例和深入解释。“JavaScript核心...

    jsp家政服务管理系统

    为了提升用户体验和系统性能,可以考虑以下优化方向: 1. 引入缓存技术,如Redis,减少对数据库的频繁访问。 2. 采用AJAX异步请求,提高页面响应速度。 3. 采用MVC框架,如Spring MVC,使代码结构更清晰,便于维护和...

    基于java的JSP开发的项目跟踪系统.zip

    **基于Java的JSP开发项目跟踪系统** Java的全栈开发能力在Web应用程序领域中具有广泛的应用,尤其是在企业级项目管理中。...在实际开发过程中,还需考虑系统的可扩展性、安全性及性能优化,确保系统稳定且易于维护。

    酒店管理系统.rar

    总结,【酒店管理系统】是一个集成了jsp和servlet技术的高效酒店管理解决方案,其详尽的业务覆盖、严谨的技术实现和细致的用户体验设计,对于学习web开发尤其是Java Web开发者来说,具有很高的参考价值。通过深入...

    WebSphere培训教程.ppt.ppt

    标准版作为基础,支持电子商务网站的建设,提供开放的平台和工具,如Servlet运行时引擎、高性能的数据库连接程序以及XML支持。高级版则增强了安全性与交易处理能力,适用于需要连接传统数据库和主机交易系统的场景。...

    java web开发技术方案宝典

    13. **性能调优**:包括内存管理、线程优化、数据库查询优化、缓存策略等,通过监控工具如JMeter、VisualVM和New Relic进行性能分析。 14. **持续集成/持续部署(CI/CD)**:Jenkins、GitLab CI/CD和Travis CI等工具...

    【Java web】编程爱好者博客地带.zip

    以上只是Java Web开发的部分知识点,实际的学习和实践中,还会涉及到更多如性能优化、故障排查、分布式系统设计等高级话题。对于编程爱好者来说,这个博客地带应该包含了丰富的学习资料和实战经验分享,有助于提升...

    WebSphere培训教程.ppt

    - **WebSphere Performance Pack**:包含了性能优化工具,如eNetwork Dispatcher和Web Traffic Express,帮助提高服务器性能和响应速度,降低网络拥塞。 WebSphere的技术优势在于: 1. **面向服务架构(SOA)支持*...

    2071_SSM网上订餐系统答辩PPT.pptx

    在技术选型上,系统采用了Mysql作为后台数据库,这是一款高性能、高可用性的关系型数据库,能够有效存储和管理大量的用户信息、订单数据以及餐厅菜单等。Mysql的简单语法和强大的功能使其成为Web开发中的常用数据库...

    图书管理系统

    JavaEE平台包含了大量用于开发Web应用和服务的组件和规范,如Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)等。这些组件为开发者提供了强大的功能,可以实现数据库交互、会话管理、事务...

    nginx tomcat memcached session共享

    Tomcat则是Apache软件基金会的Java Servlet和JavaServer Pages(JSP)容器,是运行Java Web应用程序的最常用服务器之一。然而,Tomcat默认并不支持会话的分布式管理,也就是说,当用户在集群中的不同Tomcat实例之间...

    java技术架构图汇总.doc.docx

    4. **SmartClient Ajax框架架构**:SmartClient是一个富客户端JavaScript库,用于构建高性能的Web应用。其架构基于服务器端的Ajax框架和客户端的JavaScript组件。服务器端处理业务逻辑和数据,客户端使用Ajax进行...

    WebLogic培训资料(迄今所发现的最好学习资料)

    - **应用服务器**:WebLogic作为应用服务器,它提供了运行Java EE应用程序的环境,包括Servlet、JSP、EJB等组件。 - **域**:在WebLogic中,一个域包含一组相关的服务器、集群、网络通道和其他资源,便于统一管理...

    WebLogic企业级运维实战

    理解这些配置对于确保应用的稳定性和性能至关重要。 三、集群与高可用性 WebLogic集群是提高应用可用性和负载均衡的关键。通过在多个服务器上复制应用,可以实现故障转移和负载分发。同时,了解如何配置集群服务,...

Global site tag (gtag.js) - Google Analytics