你的j2ee应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能、高弹性的jsp页面和servlet的性能优化技术。其意
思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和
jsp页面的性能,进而提升j2ee的性能。这些技术的部分用于开发阶段,例如,设计和编码阶段。另一部分技术则与配置相关。
技术1:在httpservletinit()方法中缓存数据
服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中
仅调用一次。为了提高性能,在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了
javax.sql.datasource接口的jdbc连接池。
datasource从jndi树中获得。每调用一次sql就要使用jndi查找datasource是非常昂贵的工作,而且严重影响了应用的性能。servlet的init()方法可以用于获取datasource并缓存它以便之后的重用:
publicclasscontrollerser
vletextendshttpservlet
{
privatejavax.sql.datasourcetestds=null;
publicvoidinit(servletconfigconfig)throwsservletexception
{
super.init(config);
contextctx=null;
try
{
ctx=newinitialcontext();
testds=(javax.sql.datasource)ctx.lookup("jdbc/testds");
}
catch(namingexceptionne)
{
ne.printstacktrace();
}
catch(exceptione)
{
e.printstacktrace();
}
}
publicjavax.sql.datasourcegettestds()
{
returntestds;
}
...
...
}
技术2:禁用servlet和jsp的自动装载功能
当每次修改了servlet/jsp之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它
在运行阶段是非常昂贵的;servlet/jsp由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载
的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此,在运行环境中为了得到更好的性能,关闭servlet/jsp的自动装载功能。
技术3:控制httpsession
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于http协议是无状态的,所以基于web的应用需要负责维护这样一个叫做session
的状态。为了支持必须维护状态的应用,javaservlet技术提供了管理session和允许多种机制实现session的api。
httpsession对象扮演了session,但是使用它需要成本。无论何时httpsession被使用和重写,它都由servlet读取。你可以
通过使用下面的技术来提高性能:
l在jsp页面中不要创建默认的httpsession:默认情况下,jsp页面创建httpsession。如果你在jsp页面中不用httpsession,为了节省性能开销,使用下边的页面指令可以避免自动创建httpsession对象:
<%@pagesession="false"%>
1)
不要将大的对象图存储在httpsession中:如果你将数据当作一个大的对象图存储在httpsession中,应用服务器每次将不得不处理整个
httpsession对象。这将迫使java序列化和增加计算开销。由于序列化的开销,随着存储在httpsession对象中数据对象的增大,系统的
吞吐量将会下降。
2)
用完后释放httpsession:当不在使用httpsession时,使用httpsession.invalidate()方法使sesion失效。
3)
设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把
session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时
值设置的尽可能低。
技术4:使用gzip压缩
压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(gnuzip)压缩文档能有效地减少下载html文件的时间。你的信息量越
小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩
的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。
publicvoiddoget(httpservletrequestreques
t,httpservletresponserespo
nse)
throwsioexception,servletexception
{
outputstreamout=null
//checktheaccepting-encodingheaderfromthehtt
prequest.
//iftheheaderincludesgzip,choosegzip.
//iftheheaderincludescompr
ess,choosezip.
//otherwisechoosenocompres
sion.
stringencoding=request.getheader("accept-encoding");
if(encoding!=null&&encoding.indexof("gzip")!=-1)
{
response.setheader("content-encoding","gzip");
out=newgzipoutputstream(response.getoutputstream());
}
elseif(encoding!=null&&encoding.indexof("compress")!=-1)
{
response.setheader("content-encoding","compress");
out=newzipoutputstream(response.getoutputstream());
}
else
{
out=response.getoutputstream();
}
...
...
}
技术5:不要使用singlethreadmodel
singlethreadmodel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的
请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。
singlethreadmodel在servlet2.4中是不再提倡使用。
技术6:使用线程池
servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情
况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池
来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一
个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之
后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。
技术7:选择正确的包括机制
在jsp页面中,有两中方式可以包括文件:包括指令(<%@includefile="test.jsp"%>)和包括动作
(<jsp:includepage="test.jsp"flush="true"/>)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页
面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件
经常变动,否则使用包括指令将会获得更好的性能。
技术8:在usebean动作中使用合适的范围
使用jsp页面最强大方式之一是和javabean组件协同工作。javabean使用<jsp:usebean>标签可以嵌入到jsp页面中。语法如下:
<jsp:usebeanid="name"scope="page|request|session|application"class=
"package.classname"type="typename">
</jsp:usebean>
scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。
例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存
中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因
此为对象设置合适的范围并在用完它们之后立即删除。
杂项技术
1)
避免字符串连接:由于string对象是不可变对象,使用“+”操作符将会导致创建大量的零时对象。你使用的“+”越多,产出的零时对象就越多,这将影响性能。当你需要连接字符串时,使用stringbuffer替代“+”操作。
2)
避免使用system.out.println:system.out.println同步处理磁盘输入/输出,这大大地降低了系统吞吐量。尽可能地避免
使用system.out.println。尽管有很多成熟的调试工具可以用,但有时system.out.println为了跟踪、或调试的情况下依然
很有用。你应该配置system.out.println仅在错误和调试阶段打开它。使用finalboolean型的变量,当配置成false时,在编
译阶段完成优化检查和执行跟踪输出。
3)
servletoutputstream与printwriter比较:由于字符输出流和把数据编码成字节,使用printwriter引入了小的性能开
销。因此,printwriter应该用在所有的字符集都正确地转换做完之后。另一方面,当你知道你的servlet仅返回二进制数据,使用
servletoutputstream,因为servlet容器不编码二进制数据,这样你就能消除字符集转换开销。
总结
本文的目的是展示给你一些实践的和已经证实的用于提高servlet和jsp性能的性能优化技术,这些将提高你的j2ee应用的整体性能。下一步应该观察其他相关技术的性能调整,如ejb、jms和jdbc等。
分享到:
相关推荐
在Java Web开发中,`javax.servlet.jsp.jspl.core.ConditionalTagSupport`是JSTL(JavaServer Pages Standard Tag Library)库中的一个核心类,用于支持条件标签的实现。当你遇到`java.lang.NoClassDefFoundError: ...
文件列表中的TP01至TP14可能是PPT的不同章节,覆盖了上述知识点的各个部分,帮助学员逐步掌握JSP、Servlet和Ajax的综合应用,最终实现一个功能完善的新闻发布系统。通过学习这套课件,学员不仅能够提升技术能力,还...
10. **异常处理**:学习如何在JSP和Servlet中捕获和处理异常,提升程序健壮性。 通过以上知识点的学习,学员将具备开发基于JSP和Servlet的新闻发布系统的能力,能够理解和实践Web开发中的关键技术和流程。
【JSP/Servlet应用程序优化八法】 在J2EE应用程序中,JSP和Servlet的性能优化至关重要,因为它们直接影响到应用的响应速度和系统资源的利用率。以下是一些经过实践验证的优化技术,旨在提高JSP和Servlet的性能,...
北大青鸟6.0课件S2使用JSP/Servlet/Ajax技术开发新闻发布系统2,,我只能上传小于50M的文件,所以分了2次上传,下载使用JSP/Servlet/Ajax技术开发新闻发布系统1后就是全部的了。如有问题加Q:329139513.注明来意
在本项目中,“使用JSP/Servlet/Ajax技术开发新闻发布系统2”是北大青鸟ACCP6.0课程的一部分,旨在教授学员如何...通过这个项目,学员能够掌握JSP、Servlet和Ajax的综合运用,为构建更复杂的Web应用程序打下坚实基础。
在本教程中,我们将深入探讨如何使用JSP(JavaServer Pages)、Servlet和Ajax技术来开发一个功能完善的新闻发布系统。这通常涉及到动态网页的创建、服务器端处理以及客户端的异步数据交互,从而提供流畅的用户体验。...
<servlet-class>servlet.loginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/servlet/loginServlet</url-pattern> </servlet-mapping> ...
在IT行业中,ACCP(Accelerated Computer Certified Professional)是一套针对软件开发人员的培训课程,其6.0版本的第二阶段(S2)主要聚焦于Web应用开发,特别是使用JSP(JavaServer Pages)、Servlet和Ajax...
<servlet-name>HelloWorldname</servlet-name> <!-- 此说明该<servlet/> 已经得到了注册名HelloWorldname, 既此servlet已经得到了注册名HelloWorldname, 它与<servlet-mapping/>必须注册同样的注册名 --> ...
【ACCP S2 使用JSP/...总的来说,"ACCP S2 使用JSP/Servlet技术开发新闻发布系统"课程是一个全面的Java Web开发入门教程,通过学习,学员不仅可以掌握JSP和Servlet的基础知识,还能具备实际开发动态网站的能力。
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本教程将引导你通过Eclipse IDE创建一个基本的JSP-Servlet项目,以便理解这两者如何协同工作。*...
在Web开发领域,JSP(JavaServer Pages)和Servlet是两种核心的技术,常用于构建动态、交互式的Web应用程序,如新闻发布系统。本项目"使用JSP/Servlet技术开发新闻发布系统"是基于ACCP8.0框架,旨在教授如何利用这...
【标题】北大青鸟ACCP7.0使用JSP/...综上所述,北大青鸟ACCP7.0的Y2课程通过丰富的教学资源,深入浅出地讲解了JSP和Servlet的基础知识及其在实际项目中的应用。掌握这些技能,将为你的Java Web开发之路打下坚实基础。
### JSP_Servlet应用程序优化的八种方法 #### 技术1:在`HttpServlet init()`方法中缓存数据 为了提升JSP/Servlet应用程序的性能,开发者可以在`init()`方法中缓存静态数据或执行那些成本较高的初始化操作。这是...
使用JSP/Servlet/Ajax技术开发新闻发布系统
本源码用jsp/servlet/javascript模拟了网上购物 实现了以下功能: 1.勾选某一货物时动态生成其价格和邮费 2.选择不同邮寄方式时动态生成各自的邮费 3.动态计算总费用 4.购买后显示购买详细信息
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport 问题-附件资源
在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种常见的技术,它们用于创建动态Web应用程序。JSP主要用于视图层,而Servlet则处理业务逻辑。有时,我们需要将JSP页面转换为Servlet以便更好地控制流程。本...
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建Web应用程序,尤其是动态网站方面发挥着重要作用。在这个名为“jsp/servlet blog”的项目中,我们看到一个基于这两项技术的简单博客...