当前位置:编程学习 > JSP >>

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

  举例说明,通过使用jdbc连接池是一个最好的实践,在调用javax.sql.DataSource接口的时候。依靠通过JNDI(java命名和服务接口)树获得DataSource。如果在每一次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后不用重新启动服务。可是,在生产环境下面,却是占用大量开销,因为进行了没有必要的重新载入的操作,所以带来了很怀的性能影响。同时,在部分类载入,部分为载入的时候也可能带来各种奇怪的冲突。因此在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.4中SingleThreadModel接口已经被反对使用。 

调整方法6:使用线程池 

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





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

  在jsp中有两种方法使用包含文件:包含指令(<%@ include file="test.jsp" %>) 和包含动作 (<jsp:include page="test.jsp" flush="tr

上一个:Jsp + JavaBean循序渐进教程
下一个:JSP技巧:发送动态图像

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,