你的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失效。
在web.xml中设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。
tomcat里设置session时间的3个方法
1. 在tomcat——>conf——>servler.xml文件中定义:
<Context path="/test" docBase="/test"
defaultSessionTimeOut="0" isWARExpanded="true"
isWARValidated= "false" isInvokerEnabled="true"
isWorkDirPersistent= "false"/>
2. 在web.xml中定义:
<session-config>
<session-timeout>0</session-timeout>
</session-config>
<servlet>
<servlet-name>Example</servlet-name>
<servlet-class>exa.mp.le.Example2</servlet-class>
<init-param>
<param-name>timeout</param-name>
<param-value>0</param-value>单位是秒钟
</init-param>
</servlet>
3. 在程序中定义:
session.setMaxInactiveInterval(30*60);
设置单位为秒,设置为-1永不过期
技术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超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
分享到:
相关推荐
这个特定的版本2.3.2-b01修复了一些已知问题和可能存在的安全漏洞,同时可能引入了一些新的功能或性能优化。通常,更新到最新版本的API可以确保兼容性、性能和安全性。 在实际开发中,开发者可能会遇到像...
3.1.0版本的Servlet API引入了一些增强功能,比如非阻塞I/O支持,提高了性能和效率。 Filter则允许在Servlet执行前后插入自定义的处理逻辑,比如实现身份验证、日志记录或内容转换。开发者可以通过实现`javax....
在本课程设计项目“2015最新JSP+Servlet课程设计-二手驿站”中,学生将深入学习和实践使用JSP(JavaServer Pages)和Servlet技术来构建一个基于Web的二手交易平台。该项目旨在帮助学生掌握这两项核心的Java Web开发...
理解这个过程对于优化性能和解决问题至关重要。 3. **JSP基本元素**:包括脚本元素(scriptlet、声明、表达式)、指令元素(page、include、taglib)和动作元素(jsp:include、jsp:forward等),这些元素构成了JSP...
2. **生命周期** - 了解Servlet和JSP的生命周期对于优化性能至关重要。Servlet实例化、初始化、服务和销毁的过程,以及JSP转化为Servlet的过程。 3. **部署描述符** - web.xml文件是Web应用的部署描述符,定义了...
通过JSP 2.3,我们可以创建更动态、更易维护的用户界面,而Servlet 3.1则提供了更高的性能和对新网络技术(如WebSocket)的支持。将这两个库整合到项目中,可以提升Web应用的效率、可靠性和用户体验。
### JSP与Servlet复习知识点详解 #### 一、JSP与Servlet基础知识 **1. JSP简介** - **定义**: Java Server Pages (JSP) 是一种基于Java技术的...希望以上知识点能够帮助大家深入理解和掌握JSP与Servlet的相关知识。
本文将深入探讨JSP和Servlet中的session概念,以及它们如何在Web应用程序中实现状态管理。HTTP协议本身是无状态的,这意味着每次客户端(浏览器)向服务器发送请求时,服务器无法识别请求是否来自同一个会话。为了...
此外,考虑到企业级应用的需求,该系统可能还包括了数据持久化(通过JDBC与数据库交互)、安全性(如使用HTTPS、CSRF令牌等防止攻击)、性能优化(如使用缓存减少数据库访问)以及错误处理和日志记录等方面的设计。...
8. **Performance Enhancements**:该版本还包括了一些性能优化,例如减少内存消耗和提高响应速度,使得Servlet API 2.4更加适合大型企业级应用。 总的来说,servlet-api-2.4.jar是开发和部署Java Web应用的关键...
这个组件实现了将Tomcat应用服务器中的用户session数据存储到Redis分布式缓存系统中,以提高系统的可伸缩性和性能。Redis是一个高性能的键值数据库,常被用来作为缓存服务,因其速度快、数据持久化等特点,非常适合...
在IT行业中,尤其是在Web服务器领域,Tomcat是一个广泛使用的开源应用服务器,特别是对于Java Servlet和JavaServer Pages(JSP)的应用。"tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到...
在Web开发领域,JSP(JavaServer Pages)和Servlet是常用的两种技术,它们结合使用能够构建动态、交互式的Web应用程序。本项目“JSP+Servlet实现简易购物车功能”就是一个典型的示例,它展示了如何利用这两者来创建...
在Java Web开发中,JSP(JavaServer Pages)和...不过要注意,session会占用服务器资源,过多的session可能导致服务器性能下降,因此在设计时要考虑优化,如适当设置session的超时时间,减少不必要的session数据存储。
**JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本文将深入探讨JSP和Servlet的相关面试知识点,帮助你为面试做好充分准备。** ### 1. JSP基础 ...
2020-5-11 Servlet学习---Session 2020-5-17 监听器学习 2020-5-17 IDEA中的Maven的简单使用 2020-5-18 JavaWeb学习 2020-5-19 JavaWeb学习 2020-5-21 JavaWeb学习 JSP,EL,JSTL,Filter, 2020-5-23 MVC、三层设计...
11. **JSP和Servlet的关系** JavaServer Pages(JSP)是另一种用于创建动态Web内容的技术,它可以被视为Servlet的简化版本。JSP最终会被编译为Servlet,因此Servlet API同样适用于JSP开发。 在实际开发中,掌握...
而"CeShi"可能是项目的源代码文件夹,包含JSP文件(如login.jsp、register.jsp)、Servlet文件(如LoginServlet.java、RegisterServlet.java)和其他辅助类。JSP文件通常负责展示界面,Servlet文件则负责处理后台...
【jsp留言板实例——基于Java Bean和Servlet实现】 在Web开发中,JSP(JavaServer Pages)常用于构建动态网页,而Java Bean和Servlet是Java Web应用程序的重要组成部分。本实例通过结合这三个技术,采用MVC(Model-...
Servlet和JSP是Java Web开发中的核心技术,广泛用于构建动态Web应用程序。这个"Servlet&JSP-PPT.rar"压缩包包含了一些关键文件,用于讲解和理解这两种技术。 首先,我们来看"权限表.sql",这通常是一个SQL脚本文件...