你的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超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
分享到:
相关推荐
· 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 采用伪静态页面缓存技术,管理方便,速度可与静态页面相媲美,用户自定义路径结构,无需urlrewrite · 轻松建设大规模网站,可通过次级域名建立子...
原版未删除任何东西,集成了springtools,svn,git,反编译,maven(阿里云镜像),将eclipse的插件下载地址换成国内镜像,进行部分设置,优化启动速度
原版未删除任何东西,集成了springtools,svn,git,反编译,maven(阿里云镜像),将eclipse的插件下载地址换成国内镜像,进行部分设置,优化启动速度
本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架的猎头公司管理系统,采用JEE技术开发,结合Vue前端实现,提供了一套完整的猎头公司业务流程解决方案。系统涵盖了职位管理、人才库管理、招聘流程管理、客户...
**项目名称:微信小程序Jee的高校毕业生就业信息系统** **功能介绍:** 本项目结合微信小程序的便捷性与高校就业服务的实际需求,为毕业生提供了一个全面、高效、便捷的就业信息服务平台。核心功能如下: 1. **...
JEE-Cache-Filter 在专项优化web性能过程中写的Cache Filter,服务端是Tomcat7。最优缓存策略制定参见我的文章: ####使用参考 DisableETagFilter web.xml filter配置 <filter>disableETagFilter <filter>...
这是一个具有许多严重安全问题的示例 JEE 项目。 它使您可以从以下漏洞中获得乐趣: SQL注入 HTML 注入 跨站脚本 (XSS) 跨站请求伪造 (CSRF) 会话固定 不安全的直接对象引用 ......也许还有更多:) 它绝不是优化...
包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化等处理。 调试与测试: 集成调试器允许开发者逐行执行代码,设置断点、查看变量值、跟踪调用堆栈等...
jSEO——用于动态 JEE Web 应用程序的可插入 SEO(搜索引擎优化)
JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老司机带你透析springMVC内部实现方式 打造高效代码结构(java性能优化) 新版本通俗易懂_观察者模式递进时讲解 ibatis连接数据库...
最小错误是一个灵活的两列Jekyll主题,非常适合构建个人网站,博客和... 针对搜索引擎进行了优化,并支持和数据。 可选的,, ,,相关文章, ,等。 评论支持(由 , ,Google +, ,通过基于静态的支持,以及)。
是基于JEE的网页文件上传与下载,只是简单的实现上传与下载功能,支持中文文件名,能在ie、360浏览器等主流的浏览器上使用,界面很丑,自己优化哦,只是用来交课程设计的。
Jdon框架结合对象设计和J2EE/JEE设计理念将这个看似简单功能开发过程抽象出来,放在框架中,并且随着应用程序一起运行,提供优化性能提升等。Jdon框架不是面向数据库的;而是面向模型分析设计(OOA/OOD)。
数据库系统中大量的基本功能无非是数据表的CRUD增删改查和批量分页查询,Jdon框架结合对象设计和J2EE/JEE 设计理念将这个看似简单功能开发过程抽象出来,放在框架中,并且随着应用程序一起运行,提供优化性能提升等...
而互联网公司,多少有些爱折腾的极客精神,比较喜欢开源,常把性能,优化,瓶颈挂在嘴边,技术氛围较浓,想搞个东西,证明自已牛逼,这样也更吸引技术人员。所以互联网公司,喜欢用新的,开源的东西,高性能的东西,...
Jeepay = Jee + pay,是由原XxPay支付系统作者带领团队开发,“Jee”是公司计全科技名称的表示,pay表示支付。中文名称为计全支付,释为:计出万全、支付安全,让支付更加方便安全。 项目特点: 支持多渠道对接,...
这个wiki提供jetty的入门教程、基础配置、功能特性、优化、安全、JavaEE、监控、常见问题、故障排除帮助等等。它包含教程、使用手册、视频、特征描述、参考资料以及常见问题。 Jetty文档 ---------------- 入门...
使用Jakarta EE(带有Spring Boot的微服务)的Architect企业应用程序-3月15日至19日开发Jakarta EE平台的应用程序(角度和单页应用程序)-3月25日至29日Java性能调优和优化(Java集合类,Web服务,性能调优)-4月1,2...
Java性能调优和优化(Java集合类,Web服务,性能调优)-4月1,2,5 5天使用Java EE的Architects Enterprise应用程序(带有Spring Boot的微服务) 使用Java并使用最新技术,框架和设计构建实时应用程序 使用自动化和...
Angular Cli提供UI,在更改时重新部署UI并优化生产构建。 可以在Maven构建的Docker映像中测试构建的Ear。 发展要求 Java 8 JDK或更高版本。 Eclipse Oxygen JEE或更高版本。 WildFly 10或更高版本。 (任何...