Servlet 和 JSP 性能调整

概述

       在本文中, Rahul Chaudhary将描述性能调整技术 (PTT performance-tuning techniques) 的使用,来提升servlets JSP 的性能,以此来提升你的J2EE应用的性能。笔者假设读者具有基础的servlets JSPs知识。

作者:Rahul Chaudhary

译者:guipei

 

 

你的J2EE应用程序运行缓慢么?它们可以满足足够的压力么?本文将会描述如何在开发高性能的应用和JSP以及servlets中使用性能调整技术 (PTT performance-tuning techniques)。使用这些技术可以构建更加快速、稳健的系统,以满足更多用户或者更多请求的需要。在本文中,我将会带你进行实际的实践,试验如何调整性能提升你的servlets JSP 页面缓慢的性能,最终以提升你的J2EE应用的性能。其中一部分技术使用在开发过程阶段,也就是说,适应于在你进行系统设计或者编写代码的时候。另外一些则是和配置相关技术。

 

调整方法1:使用 HttpServlet init()方法缓存数据

       应用服务器在servlet开始构造的时候,接受处理任何请求之前调用servletinit()方法。在servlet的生命周期中仅仅调用一次。Init()方法通过缓存静态数据或者完成占用大量资源的操作,用来在初始化的过程中提高性能。

       举例说明,通过使用jdbc连接池是一个最好的实践,在调用javax.sql.DataSource接口的时候。依靠通过JNDI(java命名和服务接口)树获得DataSource。如果在每一次SQL调用时候都进行JNDI查找DataSource ,将会严重的影响应用服务的应能。Servletinit()方法将用来取得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:禁止servletjsp的自动重载     

为了节约开发时间,在开发阶段Servlet/JSP容器提供自动重载功能,方便你在修改Servlet/JSP后不用重新启动服务。可是,在生产环境下面,却是占用大量开销,因为进行了没有必要的重新载入的操作,所以带来了很怀的性能影响。同时,在部分类载入,部分为载入的时候也可能带来各种奇怪的冲突。因此在J2EE的生产环境下关闭自动载入功能可以得到更好的性能。

 

       译者注:

这点被我深深的体会到。

一、              在一个大型的J2EE项目中进行大量压力测试下,在开发模式下莫名其妙的发生错误,部分请求任务失败,就是因为载入类造成的系统冲突。

二、              在另外一个大型的J2EE项目实际应用过程中,突发的大量用户让足以满足用户的系统处于瘫痪边缘,经过了系统、数据库、应用服务器等等调整后,终没有解决问题。最后不得不排除人员去现场解决,最后发现问题竟是这个原因。这个事件仅仅发生在前天。

 

调整方法3:控制HttpSession

许多应用服务需要一系列的客户请求,这些请求之间又相互依存。因为http协议是无状态的,所以基于web的应用系统必须使用session技术来维持连接。为了实现应用服务进行状态管理,java servlet技术提供了一套API,通过使用HttpSession对象进行会话管理,但是在使用这个功能的同时,不管servlet进行任何请求,HttpSession对象都要进行读写,服务器也承担了响应的系统开销。你可以使用下列方法提升性能。

       在默认情况下,不要在jsp页面中创建HttpSessions对象,jsp页面默认会自动创建HttpSessions,如果在你的jsp页面中不需要HttpSessions,为了节省一些性能,使用下面的页面指令避免自动创建HttpSessions对象。

<%@ page session="false"%>

       不要存储大型对象到HttpSession:如果你存储大型对象数据到HttpSession中,应用服务器不得不在每一次请求中处理整个的HttpSession,这将会强迫使用java的串行化操作,占用大量系统资源。应用服务的性能将会因为java的串行化操作而减少。

       在结束时候释放HttpSessions对象:在它们不在需要的时候使用HttpSession.invalidate()方法消除sessions

       设置session的超时值:servlet有一个默认的超时值。如果你在这个时间里面,你既没有移除它,也没有使用它(进行任何服务请求),servlet服务将会自动将其销毁。因为对内存和垃圾的回收处理,因此,超时值越大,对服务器的性能影响越大。所以,尽可能的保持session的超时值最小。

 

 

调整方法4:使用gzip压缩

压缩是一个去处庸余信息的操作,以便可以使用最小的空间存储。使用gzip(GNU zip)压缩内容可以显著的减少下载HTML文件的时间。信息内容越小,传送的速度越快。因此,如果在生成web应用的时候压缩内容,就可以更快的传送、显示在用户的屏幕上面。由于不是每一个浏览器都支持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将会为每一个新的请求创建隔离的servelet实例,这将造成很大的系统开销。如果你需要处理线程安全问题,可以使用其他方法代替这种方法。在servlet2.4SingleThreadModel接口已经被反对使用。

 

 

调整方法6:使用线程池

       Servlet引擎为每一个请求创建一个隔离的线程,分配这个线程给service()方法,在它执行完后移除这个线程。默认情况下,servlet引擎为每一个请求创建新的线程。因为创建和消除线程是需要系统开销的,这种行为将会引起性能问题。可以通过使用线程池来提升性能。依据所期望的并发用户数量,配置线程池的最大、最小、以及增加数量。在服务启动的时候,servlet引擎使用最小的线程数量创建一个线程池。然后servlet引擎会分配线程给每一个请求,替换原来的创建新的线程,在处理完成后把线程返回给线程池。使用线程池,性能会有一个显著的提升。如果需要,根据线程的最大和增加数量,更多的线程会被创建,添加到池中以供更多的请求使用。

 

 

调整方法7:选择正确的包含机制

       jsp中有两种方法使用包含文件:包含指令(<%@ include file="test.jsp" %>) 和包含动作 (<jsp:include page="test.jsp" flush="true" />)。包含指令在转换的过程中包含文件内容;也就是说,在一个页面转换成一个servlet的时候。包含动作在请求处理的阶段包含文件内容;也就是说,在一个用户请求页面的时候。包含指令快于包含动作。因此,除非被包含的内容经常变化,应该使用包含指令提升性能。

 

 

调整方法8:选择正确的范围在使用useBean动作

       Jsp页面的一个强大功能就是在jsp中交互使用JavaBeans组件。通过使用<jsp:useBean>动作标签,JavaBeans可以被直接的嵌入jsp页面中。语法如下:

<jsp:useBean id="name" scope="page|request|session|application" class=

  "package.className" type="typeName">

</jsp:useBean>

       范围属性指定了bean的作用范围。它的默认值是page。你可以根据你的系统要求选择正确的范围。否则它会影响到应用系统的性能。

举例说明,如果你需要一个对象仅仅作为请求使用,但是你的范围设置为session,在你完成请求后,这个对象将依然会留在内存中。直到你明确的清楚它为止,通过销毁session,或者session自动超时。假如你没有选择正确的范围,它同样也会影响性能因为过度的内存和垃圾收集。因此,需要正确的设置对象的范围,同时当你使用完成之后,也应该立即去除它们。

 

 

其他方法:

       避免字符串相加:使用 + 操作会产生很多临时对象,因为String是不可变化(immutable)的对象。越多的 + 操作,越多的临时对象会被创建,造成很大的系统开销。使用StringBuffer替换 + 操作,当你需要字符串相加的时候。

 

       避免使用System.out.printlnSystem.out.println是同步处理的在disk i/o操作中,并且会严重的影响性能。因此最大可能的要避免使用System.out.println。尽管存在强大的调试工具,有时候为了跟踪目的、错误处理、调试程序,还是使用System.out.println。你应该配置System.out.println仅仅在开发和调试情况下使用。使用一个静态的final boolean变量,在生产模式下,配置成false,避免System.out.println的使用。

 

       ServletOutputStream比较PrintWriter:使用PrintWriter会占用一些系统开销,因为它是为处理字符流的输出输出功能。因此PrintWriter应该使用在确保有字符集转换的环境中。换句话说,在你知道servlet返回的仅仅是二进制数据时候,应该使用ServletOutputStream,这样你可以消除字符转换开销,当servlet容器不用处理字符集转换的时候。

 

 

总结

       本文的目的是通过一些实践操作,使用性能调整技术,通过提升servletsjsp页面的性能,进而提升J2EE应用系统的性能。下一次将会涉及性能调整关于EJB (Enterprise JavaBeans), JMS (Java Message Service), and JDBC (Java Database Connectivity)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于servlet+jsp+mysql开发的JavaWeb学生成绩管理系统,可以实现对学生信息、课程信息和成绩信息的管理。系统的主要功能包括学生信息的添加、修改、删除和查询,课程信息的添加、修改、删除和查询,成绩信息的录入、修改、删除和查询等。同时,系统还可以生成各种报表,如学生信息报表、课程信息报表、成绩信息报表等,方便管理员进行数据分析和决策。系统的开发需要掌握JavaWeb开发技术、ServletJSP的使用、MySQL数据库的操作等知识。 ### 回答2: JavaWeb学生成绩管理系统是一项基于servletjsp和mysql开发的管理信息系统,旨在为教育管理部门和教师提供一个便利的平台,帮助他们轻松地管理和分析学生成绩和课程信息。 该系统涵盖了学生信息管理、课程信息管理、成绩管理、教师信息管理、管理员信息管理五个模块。在学生信息管理模块,管理员可以添加、修改及删除学生信息,同时可对学生信息进行查询和导出等操作;在课程信息管理模块,管理员可以添加、修改及删除课程信息,同时可对课程信息进行查询和导出等操作。 在成绩管理模块,管理员可以将学生从课程中添加进去,对学生的成绩进行管理、修改及删除等操作。同时,该模块内置了成绩分析和统计功能,使得教师可以使用统计图表看到平均分、最高分、最低成绩等信息,以更好地了解学生的学习情况。 在教师信息管理模块,管理员可以添加、修改及删除教师信息,同时可对教师信息进行查询和导出等操作。教师可以使用该模块对自己授课的课程进行成绩管理并进行统计分析。 在管理员信息管理模块,管理员可以对自己的账号信息进行管理,包括修改密码、添加、删除及修改管理员信息等操作。 总体来说,JavaWeb学生成绩管理系统通过servletjsp和mysql等技术的应用,实现了对学生成绩、课程等信息进行全方位管理,并且使得数据的统计、排序、查询等功能更加的便捷和高效,为教育管理和学习提供了极大的便利。 ### 回答3: 基于servlet jsp mysql开发javaweb学生成绩管理系统是一种非常实用的系统,可以帮助管理者和学生更好地进行成绩管理。通过该系统,管理者可以随时查看学生的成绩情况,对学生进行动态管理,帮助学生更好地提高成绩。同时,学生也可以随时了解自己在课程中的成绩和提升方向,方便自我调整和完善。 该系统采用了servlet jsp mysql技术进行开发,具有以下优点: 1. 通过servlet技术,可以实现后台数据传输和处理,确保系统的稳定性和安全性; 2. 通过jsp技术,可以实现动态网页的生成和展示,提供更好的用户体验;同时,jsp还可以方便地进行数据查询和修改操作; 3. 通过mysql作为数据库,可以实现数据的存储和管理,确保数据的完整性和可靠性;同时,mysql还具有较高的性能和扩展性,可以满足系统的快速增长。 在实现该系统时,需要进行以下步骤: 1. 分析需求,确定系统的功能和界面设计; 2. 设计数据库结构,确定数据表和字段; 3. 编写servletjsp代码,实现数据的查询、修改和展示功能; 4. 联调测试,确保系统的稳定性和可用性; 5. 部署上线,让用户可以随时使用系统。 总之,基于servlet jsp mysql技术开发javaweb学生成绩管理系统,可以有效提高学生的成绩和帮助管理者更好地管理学生成绩,是一种非常实用和有用的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值