你的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超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
分享到:
相关推荐
JEE6(Java Platform, Enterprise Edition 6)是Java EE的第六个版本,它在Java EE 5的基础上对Java的企业级应用开发进行了进一步的优化和增强。JEE6不仅包括了Java EE 5的大多数特性,还引入了更多的新功能和技术,...
在Windows平台上,Eclipse JEE Neon 3 提供了针对x86_64架构的优化,确保了在64位系统上的流畅运行。 首先,Eclipse JEE Neon 3 的核心是其对Java EE的深度支持。它内置了对Java语言的完整支持,包括语法高亮、代码...
此版本特别针对Windows 64位系统进行了优化,这意味着它可以处理更大的内存需求,适合开发复杂的JEE项目。同时,它也兼容常见的Windows操作系统特性,如任务栏集成、快捷方式创建等。 5. **安装与配置**: 开始...
《Eclipse JEE 2023-06-R for Windows x64:深度解析与应用》 Eclipse JEE 2023-06-R-win32-x86_64.zip 是一个专为Windows操作系统设计的压缩包,其中包含了最新版本的Eclipse集成开发环境(IDE)的Java企业版(JEE...
而在高并发的大数据量处理场景下,系统的可伸缩性和性能优化也是开发者不可忽视的关键点。 综上所述,JEE入门教育的目的是为了让开发者能够迅速理解并运用JEE平台提供的丰富资源,通过标准化的框架和API来高效地...
在这一版本中,开发者可能期待找到针对当时最新JEE标准的支持,以及对其他流行技术的兼容性优化。 【Win32-x86_64】:这表明该软件是为Windows操作系统32位版本的64位处理器编译的。虽然现在大多数计算机都运行64位...
1. **性能优化**:提升了启动速度和内存使用效率,提供了更好的用户体验。 2. **Java 14支持**:增加了对最新Java语言特性的支持,如Records和Pattern Matching。 3. **改进的Git支持**:更新了Git客户端,增强了...
Eclipse-jee-mars-R-win32-x86_64位官方绿色版.zip是一个针对Windows平台的64位版本的Eclipse集成开发环境(IDE)的压缩包,特别为Java企业级(J2EE)应用程序开发设计。该版本发布于2015年6月30日,是当时Eclipse ...
这个版本的发布日期是2017年,对已有功能进行了优化,同时引入了对新语言和技术的支持。 2. **JEE支持**: "jee"代表Java Enterprise Edition,表明此版本的Eclipse是为开发Java Web应用、企业级服务和分布式系统而...
这个版本的Eclipse针对Windows 64位操作系统进行了优化,提供了一个高效、稳定的开发平台,即“eclipse-jee-mars-1-win32-x86_64.zip”压缩包。本文将深入探讨Eclipse JEE Mars在Windows 64位环境下的安装、配置以及...
2022-06 R版本是Eclipse的最新稳定版,其中“R”代表“Release”,意味着这是一个经过充分测试和优化的正式发布版本。此版本可能包含了最新的特性、性能改进和bug修复,确保了开发者在使用过程中的高效和稳定性。 ...
Steven中文网志可能是一位博主的个人站点,他在其中分享了对RESTlet在JEE环境下的理解和应用,包括架构设计、性能优化和最佳实践等内容。 "restlet-jee-2.0.9.zip"是RESTlet-jee-2.0.9的源代码或者库文件,可能包含...
"eclipse-jee-2020-12"是Eclipse针对Java企业版(Java EE)的一个特定版本,发布于2020年12月。这个版本包含了多项更新、改进和新特性,旨在提高开发者的工作效率和代码质量。 首先,Eclipse 2020-12 提供了对最新...
此版本号4.6.3指的是Eclipse Neon系列的第三次更新,专门针对Java企业版(Java Enterprise Edition,简称JEE)进行优化,旨在为Web应用程序和企业级项目提供高效、全面的开发支持。 Eclipse Neon引入了许多新特性,...
在本篇博客“JEE、Spring、Spring MVC、MyBatis 学习...同时,作者可能还会分享关于配置、最佳实践、性能优化以及异常处理等方面的实战经验。通过学习这些内容,开发者可以更有效地构建高效、可维护的Java企业级应用。
5. **Java和Web开发工具**:包括源代码编辑器、调试器、构建工具和部署工具,帮助开发者高效地编写、测试和优化Java EE应用程序。 6. **Java EE API支持**:提供对Servlet、JSP、JPA、JMS等技术的完整API文档,便于...
总的来说,Eclipse JEE Oxygen是一款强大且全面的Java EE开发工具,它不仅提供了开发所需的全部功能,还通过汉化包优化了用户体验,是Java初学者入门和专业开发者日常工作的得力助手。通过深入学习和熟练掌握Eclipse...
《Eclipse JEE 2020-12 R 中文版:打造高效Java开发环境》 Eclipse JEE 2020-12 R 是一个强大的集成开发环境(IDE),专为Java企业级应用开发设计。这个版本是Eclipse的年度发布,集成了最新的技术和优化,旨在提供...
这个版本是2019年的第三个发布版(Release),通常每个版本都会带来性能优化、新功能和修复已知问题。"R"代表Release,意味着这是一个稳定版本,适合开发者日常使用。下载这个压缩包后,用户无需进行复杂的安装过程...
Luna是Eclipse的一个重大版本,发布于2014年,它引入了许多新特性并优化了性能。对于JEE开发者来说,这个版本提供了全面的工具集,包括Web、企业级应用和云开发的支持。SR2则是一个重要的维护更新,修复了前一版本的...