知识大全 高性能、高弹性JSP和Servlet性能优化
Posted 知
篇首语:好汉做事干到底,好马登程跑到头。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 高性能、高弹性JSP和Servlet性能优化相关的知识,希望对你有一定的参考价值。
高性能、高弹性JSP和Servlet性能优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
你的J EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能 高弹性的JSP页面和Servlet的性能优化技术 其意思是建立尽可能快的并能适应数量增长的用户及其请求 在本文中 我将带领你学习已经实践和得到证实的性能调整技术 它将大大地提高你的servlet和jsp页面的性能 进而提升J EE的性能 这些技术的部分用于开发阶段 例如 设计和编码阶段 另一部分技术则与配置相关
技术 在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;
技术 禁用servlet和Jsp的自动装载功能
当每次修改了Servlet/JSP之后 你将不得不重新启动服务器 由于自动装载功能减少开发时间 该功能被认为在开发阶段是非常有用的 但是 它在运行阶段是非常昂贵的 servlet/JSP由于不必要的装载 增加类装载器的负担而造成很差的性能 同样 这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象 因此 在运行环境中为了得到更好的性能 关闭servlet/JSP的自动装载功能
技术 控制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的超时值设置的尽可能低
技术 使用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 press choose ZIP // Otherwise choose no pression
String encoding = request getHeader("Accept Encoding");
if (encoding != null && encoding indexOf("gzip") != ) response setHeader("Content Encoding" "gzip"); out = new GZIPOutputStream(response getOutputStream()); else if (encoding != null && encoding indexOf("press") != ) response setHeader("Content Encoding" "press"); out = new ZIPOutputStream(response getOutputStream()); else out = response getOutputStream();
技术 不要使用SingleThreadModel
SingleThreadModel保证servlet一次仅处理一个请求 如果一个servlet实现了这个接口 servlet引擎将为每个新的请求创建一个单独的servlet实例 这将引起大量的系统开销 如果你需要解决线程安全问题 请使用其他的办法替代这个接口 SingleThreadModel在Servlet 中是不再提倡使用
技术 使用线程池
servlet引擎为每个请求创建一个单独的线程 将该线程指派给service()方法 然后在service()方法执行完后删除该线程 默认情况下 servlet引擎可能为每个请求创建一个新的线程 由于创建和删除线程的开销是很昂贵的 于是这种默认行为降低了系统的性能 我们可以使用线程池来提高性能 根据预期的并发用户数量 配置一个线程池 设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值 起初 servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池 然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程 完成操作之后 servlet引擎把线程放回到线程池中 使用线程池 性能可以显著地提高 如果需要 根据线程的最大数和增长数 可以创建更多的线程
技术 选择正确的包括机制
在JSP页面中 有两中方式可以包括文件 包括指令(< %@ include file="test jsp" %>)和包括动作(< jsp:include page="test jsp" flush="true" />) 包括指令在编译阶段包括一个指定文件的内容 例如 当一个页面编译成一个servlet时 包括动作是指在请求阶段包括文件内容 例如 当一个用户请求一个页面时 包括指令要比包括动作快些 因此除非被包括的文件经常变动 否则使用包括指令将会获得更好的性能
技术 在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 你应该根据你应用的需求选择正确的范围 否则它将影响应用的性能
cha138/Article/program/Java/JSP/201311/20349相关参考
JSP和Servlet的性能优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在本文中带领你学
方法一在servlet的init()方法中缓存数据
Java进阶:用缓冲技术提高JSP的性能和稳定 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一
JSP和Servlet配置详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先是下载工具
在jsp和servlet的开发中今天自己做的一个小例子中出现了中文乱码问题用了许多方法发现还是解决不了最后我用了过滤器才算终结 此方法总结如下在jsp页面中使用<%@pagepageEnc
Servlet和JSP迈上新台阶 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 即将面世的JEE
浅析Servlet和Jsp中的多国语言显示 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 因为一
知识大全 Tomcat下JSP、Servlet和JavaBean环境配置
Tomcat下JSP、Servlet和JavaBean环境配置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 OracleFreelist和HWM原理及性能优化
OracleFreelist和HWM原理及性能优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!近
知识大全 Java Servlet 和 JSP入门教程(1)
JavaServlet和JSP入门教程(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 概述