- 浏览: 853797 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zjhzwx1212:
为什么用threadLocal后,输出值是从20开始的,而定义 ...
j2ee的线程安全--threadlocal -
aeoluspu:
不错 mysql 测试部分感觉不详细
用sysbench(或者super-smack)测试mysql性能 -
nanPrivate:
有没有例子,只理论,实践起来还是不会啊
JMS可靠消息传送 -
lwclover:
一个网络工程师 装什么b
postfix 如何删除队列中的邮件 -
maimode:
我也欠缺不少啊
理想的计算机科学知识体系
概述
在本文中, 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="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.println:System.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容器不用处理字符集转换的时候。
总结
本文的目的是通过一些实践操作,使用性能调整技术,通过提升servlets和jsp页面的性能,进而提升J2EE应用系统的性能。下一次将会涉及性能调整关于EJB (Enterprise JavaBeans), JMS (Java Message Service), and JDBC (Java Database Connectivity)。
发表评论
-
Improving performance and scalability with DDD
2010-09-19 14:57 1081http://gojko.net/2009/06/23/imp ... -
Java EE meets Web 2.0
2010-09-19 14:56 2515http://www.ibm.com/developerwor ... -
最全面的Hibernate 性能优化技巧
2010-08-19 16:28 1193http://www.duka ... -
必备的 Java 参考资源列表
2010-03-16 11:42 1452Java™ 平台不久将迎来 ... -
CWE/SANS发布2010年25个最危险的编程错误
2010-02-26 09:05 1253http://www.infoq.com/cn/news/20 ... -
一个程序员的多年珍藏(Java&Linux)
2010-01-15 17:25 5477http://jythoner.iteye.com/blog/ ... -
Java 推荐读物与源代码阅读
2010-01-15 17:24 1163http://jythoner.iteye.com/blog/ ... -
A Spring Security ACL tutorial for PostgreSQL
2010-01-01 22:48 1547http://server.denksoft.com/word ... -
ddd using jpa
2009-12-28 10:00 1091http://www.iteye.com/topic/6540 ... -
java的ddd框架
2009-12-28 09:43 2728SpringXT是Spring框架的一个扩展用于开发riche ... -
hibernate session cache tips
2009-12-27 22:13 10121、只有当通过主键load或者get时,hibernate才不 ... -
事物tips
2009-12-27 20:27 9801、只读标志只在事务启动时应用。不启动任何事务,则只读标志被忽 ... -
常用正则表达式
2009-12-24 10:11 1025Email : /^\w+([-+.]\w+)*@\w+([- ... -
hibernate batch insert 和id策略
2009-11-17 10:40 1159在id生成策略为native的情况下,batch insert ... -
两个好用的java反编译工具
2009-11-09 09:54 906jad jd-gui -
Design Patterns in Dynamic Programming
2009-11-07 23:04 1077http://norvig.com/design-patter ... -
几个好用的开源工具
2009-11-02 14:20 1180DBDesigner4 一款开源的数据库设计、建模、维 ... -
持续集成的极好例子
2009-10-28 09:56 1981http://www.iteye.com/topic/4993 ... -
fix tomcat memory settings
2009-10-27 16:10 973-Dorg.apache.jasper.runtime.Bod ... -
CI和maven私服
2009-10-22 18:56 1082Nexus quickbuild hudson
相关推荐
总之,Java Servlet和JSP结合Tomcat服务器为Java Web开发提供了强大的工具集,不仅能够创建功能丰富的动态网站,还确保了高效率、高性能和良好的可维护性。掌握这些技术是成为Java Web开发者的必经之路。
这个“修改servlet和jsp模板.zip”文件可能包含了一个示例项目,帮助开发者理解如何定制和调整这两种技术的模板。下面我们将深入探讨Servlet和JSP的相关知识点。 1. **Servlet**: - **定义**:Servlet是Java编写...
在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种重要的技术,它们...通过以上知识点的掌握,开发者可以更好地理解JSP和Servlet在性能上的优劣,从而做出更明智的技术选择,提高Web应用的性能和用户体验。
在实际应用中,你可以根据项目需求对这个组件进行配置和定制,例如调整样式、设置查询逻辑或优化性能。 总结来说,使用Servlet和JSP实现百度搜索自动补全功能的关键在于前端的实时请求与后端的高效响应。通过Ajax...
在使用Tomcat开发JSP和Servlet时,需要注意一些关键点以确保程序的正确运行和优化。以下是根据提供的文件内容整理的一些重要问题和解决方案: 1. **创建Tomcat项目**: - 在Eclipse等集成开发环境中,需要创建一个...
【jsp+servlet聊天源码】是一个典型的Web应用程序开发示例,它结合了JavaServer Pages (JSP) 和Servlet技术来实现在线聊天功能。这个源码对于开发者来说是一个很好的学习资源,可以帮助他们理解如何在实际项目中运用...
《基于JSP、Servlet和JavaBean的网上商城项目详解》 网上商城项目是现代电子商务的重要组成部分,本项目采用经典的JSP、Servlet和JavaBean技术进行实现,提供了完整的源码,旨在帮助开发者理解和学习如何构建一个...
当用户请求特定页码时,Servlet将调整JavaBean中的查询条件,限制返回的数据范围,然后将结果传递给JSP进行展示。JSP可以使用循环结构显示每条数据,并提供导航链接让用户跳转到其他页。 综上所述,"关于servlet+...
开发者可以灵活地调整查询条件,同时利用Servlet和JSP的交互,为用户提供直观的页面导航。这种分页实现方式在实际开发中具有很高的应用价值,尤其是在大型Web应用中,它能够有效地提升用户体验和系统性能。
本项目聚焦于使用JSP、JavaBean和Servlet技术,结合Oracle与MySQL两种主流关系型数据库实现分页功能。以下将详细介绍这些技术及其在分页中的应用。 1. JSP(JavaServer Pages):JSP是一种动态网页技术,允许开发...
* 数据库性能调整:使用mysql的调整工具来调整数据库性能 术语与缩写解释: * SPPSD:Simplified Parallel Process 系统设计 * SEPG:System Engineering Process Group * ER(D):实体关系图 本数据库设计报告...
总的来说,【贵美商城】是一个集成了Servlet、JSP和Oracle的Web应用程序,提供了基础的电商功能。对于学习Java Web开发或希望搭建类似平台的人来说,这是一个很好的实践案例。通过深入研究这个项目,开发者不仅可以...
在IT行业中,JSP(JavaServer Pages)和Servlet是用于构建动态Web应用程序的两种核心技术。在本项目"Jsp+servlet实现购物车逻辑"中,我们将会深入探讨如何利用这两种技术来模拟像淘宝、天猫这样的电商平台的购物车...
在本项目中,“基于原生Servlet与JSP实现的简单个人博客系统”是一个基础的Web应用程序,它利用了Java Servlet和JavaServer Pages (JSP) 技术来构建一个简单的博客平台。Servlet是Java编程语言中用于扩展服务器功能...
6. **维护与更新**:根据业务需求和用户反馈持续调整和优化网站功能。 通过这种方式,JSP、Servlet和JavaBean的结合不仅提供了灵活的开发模式,还保证了代码的可维护性和扩展性,对于构建一个功能齐全、用户体验...
"jsp servlet海鲜超市" 这个标题揭示了这是一个使用JSP(JavaServer Pages)和Servlet技术构建的项目,主要用于海鲜超市的管理。描述中的 "jsp海鲜超市管理 应用 jsp oracle" 提到了项目是应用于海鲜超市的管理,...
12. **性能优化**:了解如何通过调整Tomcat参数和代码优化提升Web应用性能。 这个项目提供的源码涵盖了上述多个知识点,尽管原作者遇到一些问题,但已经全部实现。通过研究和实践这些代码,你将能够全面掌握JSP、...
本主题主要探讨的是使用Java、Servlet以及JSP进行分页操作的方法和技术。以下将详细介绍这些技术及其背后的原理。 首先,让我们从Java和Servlet的角度来看分页。在服务器端,Servlet扮演着接收请求、处理数据并返回...
【JSP + Servlet + MySQL 购物商城源码详解】 在互联网开发中,构建一个购物商城系统是一项常见的任务,而“JSP + Servlet + MySQL”是实现这一目标的经典技术组合。这个组合提供了从前端展示到后端数据处理的全面...
在这个项目中,使用了Java技术栈,包括JSP(JavaServer Pages)、Servlet和MySQL数据库,这些都是构建动态网站的关键组件。 **JSP(JavaServer Pages)**是Java的一种服务器端脚本语言,用于生成动态网页。在本项目...