[size=medium]调整JSP和servlet的一些非常实用的方法,它将使你的servlet和JSP页面响应速度更快,更具可扩展性。和系统上的负载会在用户数量增加的情况下,显示出平稳的长期趋势。在这篇文章中,我将通过实际例子和配置意想不到的升级应用程序的性能。其中,在你的编程工作中的一些调谐技术。和其他技术相关的应用程序服务器配置。
在这篇文章中,我们将详细地描述怎样通过调整servlet和JSP页面,您的应用程序,以提高整体性能。在阅读本文之前,假设你有一个基本的servlet和JSP的知识。
方法一:在servlet的init()方法的缓存数据
当应用服务器初始化servlet实例,为客户端请求提供服务时,它调用servlet的init()方法。生命周期的一个servlet的init()方法只被调用一次。在init()方法中缓存静态数据或完成,只需要执行耗时的操作,可以大大提高系统的性能。
例如,在init()方法来建立一个JDBC连接池是一个最好的例子,假设我们是用JDBC2.0的DataSource接口,数据库连接,在正常情况下,我们需要通过JNDI来源获取的具体数据。我们可以想像,在一个特定的应用程序,如果每次SQL查询必须执行一次JNDI查找,然后,系统性能将会急剧下降。解决方法是将下面的代码,通过缓存的数据源的SQL调用,可以继续使用它的下一次:
公共类ControllerServlet延伸的HttpServlet {私人javax.sql.DataSource的testDS = NULL;公共无效的init(ServletConfig配置)抛出ServletException {super.init(配置);上下文CTX = NULL;尝试{CTX =新的InitialContext(); testDS =( javax.sql.DataSource的)ctx.lookup(“jdbc / testDS的”);}的catch(NamingException的NE){ne.printStackTrace();}赶上(例外五){论坛主题贴();}}公共javax.sql。 DataSource的getTestDS(){返回testDS;} ...}方法2:禁用servlet和JSP自动重载(自动重载)
的Servlet / JSP提供了一个实用的技术,即自动重载技术,它提供了一个良好的发展环境,而无需重新启动应用服务器,当你改变servlet和JSP页面的开发。然而,这个系统在生产阶段的技术资源,是一个巨大的损失,因为它会给JSP引擎的类装载器(classloader)下施加了沉重的负担。因此,关闭自动重载功能对系统性能有很大的帮助。
方法3:不要滥用HttpSession中
在许多应用中,我们的程序需要保持客户端的状态,以便页面可以是相互关联的。不幸的是,出生由于HTTP的无状态,从而无法保存客户端状态。一般应用服务器提供了一个会议,以保存客户的状态。 JSP应用服务器的HttpSession要实现会议的功能,但在同一时间,很方便,它也带来了不小的负担系统。因为每当你获得或更新session时,系统是费时的操作顺序。您可以向以下HttpSession来提高系统的性能:
如果你不需要,你应该关闭JSP页面的HttpSession的缺省设置:如果你不明确指定,然后每个JSP页面将默认创建一个HttpSession。如果你不需要使用在你的JSP会话,然后由下面的JSP页面指示符来禁止它:
<%会话=“假”%>不存储在HttpSession中的大量数据,如:如果你存储在HttpSession中大型数据之类的,然后,只要是读,写,应用服务器将其序列化,从而增加了系统的额外负担。像更大的HttpSession中存储的数据,该系统的性能下降得更快。
当你不需要HttpSession中,尽快释放它:当你不再需要一个会话,您可以致电HttpSession.invalidate()方法来释放它。
尽可能的会话超时设置过短:在JSP应用服务器,默认的会话超时。当客户在此时间后,再没有会话的操作,系统会自动从内存中释放。超时设置就会越大系统的性能较低,所以最好的办法是要尽量保持在一个较低的水平及其价值。
方法4:页面输出压缩
压缩是解决数据冗余的一个好方法,尤其是在欠发达的网络带宽,今天。一些浏览器支持gzip(GNU zip的)压缩的HTML文件,这种方法可以大大减少HTML文件的下载时间。
因此,如果你的servlet或JSP页面生成的压缩的HTML页面,然后,用户会发现页面浏览速度是非常快的。不幸的是,并非所有浏览器都支持gzip压缩,但可以由客户在你的程序来检查浏览器是否支持它。下面是有关此方法的一个片段:
公共无效的doGet(HttpServletRequest的请求,HttpServletResponse的回应)=空字符串编码= request.getHeader(“的Accept-Encoding”)抛出IOException异常,ServletException {OutputStream的!(encoding! = NULL,&& encoding.indexOf(“gzip压缩”)= -1){request.setHeader(“内容编码”,使用“gzip”);出新的GZIPOutputStream的(request.getOutputStream());}!否则,如果(encoding!空&& encoding.indexOf的(“压缩”)= -1){request.setHeader(“内容编码”,“压缩”);出新ZIPOutputStream(request.getOutputStream());} {出= request.getOutputStream();} ......}方法5:使用线程池
默认的应用服务器为每个客户端请求创建一个线程处理,并为他们的service()方法,当service()方法调用完成分配,相应的线程也将被撤回。创建和撤消线程会消耗一定量的系统资源,降低系统的性能在此默认模式。但是,幸运的是,我们可以改变这种情况下,通过创建一个线程池。
此外,我们必须为这个线程池设置一个最小线程数和一个最大线程数。应用服务器启动时,它会创建一个数等于最低数量的线程,线程池,当客户的要求,相应的出池进行处理,处理完成时,然后英寸线程池线程如果线程池是不够的,系统会自动地增加池中线程的数量,但总不能超过最大线程数。通过使用线程池,当客户端请求在系统负荷剧增将呈现平稳上升的曲线,从而提高了系统的可扩展性。
方法6:选择正确的页面包含机制
有两种方法可以用来包含另一个JSP页面
1,使用include指令(<%@ includee文件“的test.jsp”%>)。
2,使用的JSP指标(<jsp:includee page="test.jsp" flush="true"/>)。
在实践中,我发现,如果使用第一种方法,可以使一个更高的系统性能。
方法7:确定的JavaBean的生命周期
在JSP的一个强大的地方是javabean的支持。在JSP页面中使用的<jsp:useBean>标签,JavaBean可以直接插入到一个JSP页面。其用途如下:
<jsp:useBean id="name" scope="page|request|session|application" class= "package.className" type="typeName"> </ JSP:useBean的scope属性指出了这个bean的生命周期。默认页面的生命周期。如果你没有选择权的bean的生命周期,它会影响系统的性能。
例如,如果你想使用bean的请求,但你却将会话bean的生命周期设置,这个请求结束时,这个bean将仍然保留在内存中,除非会话超时或用户关闭浏览器。这会消耗一些内存,并不必要地增加了JVM垃圾收集器的工作量。因此,设置正确的bean的生命周期,并尽快豆清洗他们的使命结束后,它会使用系统性能的改善。
其他一些有用的方法,尽可能的字符串串联操作不使用“+”操作符:在java编程中,我们经常使用“+”操作符连接多个字符串,但你可能从来没有想到这一点实际上对系统性能的影响?由于字符串是一个常量,因此JVM会产生一些临时对象。您可以使用“+”越多,像更使系统的性能将有一定的影响产生的暂时的。解决的办法是使用StringBuffer的,而不是像“+”操作符。
避免使用System.out.println()方法:由于对System.out.println()是一个同步调用,调用它,磁盘I / O操作必须等待它的完成,所以我们必须要尽量避免它调用。但我们在调试器中,它是一个重要的得心应手的工具,为了解决这个矛盾,我建议你使用Log4j工具http://Jakarta.apache.org;最好的,它可以方便调试,而不会产生系统通过out.println()这样的方式。
ServletOutputStream与PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它的原始输出转换为字符流输出,所以如果你使用它作为页面输出,那么系统必须支付一个转换过程。使用ServletOutputStream作为页面输出不存在问题,但它是一个二进制输出。为了在实际应用中的利弊权衡。
总结
Servlet和JSP调整技术,大大提高了应用程序的性能,从而提升整个J2EE应用的性能。通过这些调优技术,你可以发现,其实,不是一个技术平台(如J2EE和。NET的争议)确定应用程序的性能,重要的是你想有一个更深入的了解这个平台,所以可以从根本上优化的应用。[/size]
在这篇文章中,我们将详细地描述怎样通过调整servlet和JSP页面,您的应用程序,以提高整体性能。在阅读本文之前,假设你有一个基本的servlet和JSP的知识。
方法一:在servlet的init()方法的缓存数据
当应用服务器初始化servlet实例,为客户端请求提供服务时,它调用servlet的init()方法。生命周期的一个servlet的init()方法只被调用一次。在init()方法中缓存静态数据或完成,只需要执行耗时的操作,可以大大提高系统的性能。
例如,在init()方法来建立一个JDBC连接池是一个最好的例子,假设我们是用JDBC2.0的DataSource接口,数据库连接,在正常情况下,我们需要通过JNDI来源获取的具体数据。我们可以想像,在一个特定的应用程序,如果每次SQL查询必须执行一次JNDI查找,然后,系统性能将会急剧下降。解决方法是将下面的代码,通过缓存的数据源的SQL调用,可以继续使用它的下一次:
公共类ControllerServlet延伸的HttpServlet {私人javax.sql.DataSource的testDS = NULL;公共无效的init(ServletConfig配置)抛出ServletException {super.init(配置);上下文CTX = NULL;尝试{CTX =新的InitialContext(); testDS =( javax.sql.DataSource的)ctx.lookup(“jdbc / testDS的”);}的catch(NamingException的NE){ne.printStackTrace();}赶上(例外五){论坛主题贴();}}公共javax.sql。 DataSource的getTestDS(){返回testDS;} ...}方法2:禁用servlet和JSP自动重载(自动重载)
的Servlet / JSP提供了一个实用的技术,即自动重载技术,它提供了一个良好的发展环境,而无需重新启动应用服务器,当你改变servlet和JSP页面的开发。然而,这个系统在生产阶段的技术资源,是一个巨大的损失,因为它会给JSP引擎的类装载器(classloader)下施加了沉重的负担。因此,关闭自动重载功能对系统性能有很大的帮助。
方法3:不要滥用HttpSession中
在许多应用中,我们的程序需要保持客户端的状态,以便页面可以是相互关联的。不幸的是,出生由于HTTP的无状态,从而无法保存客户端状态。一般应用服务器提供了一个会议,以保存客户的状态。 JSP应用服务器的HttpSession要实现会议的功能,但在同一时间,很方便,它也带来了不小的负担系统。因为每当你获得或更新session时,系统是费时的操作顺序。您可以向以下HttpSession来提高系统的性能:
如果你不需要,你应该关闭JSP页面的HttpSession的缺省设置:如果你不明确指定,然后每个JSP页面将默认创建一个HttpSession。如果你不需要使用在你的JSP会话,然后由下面的JSP页面指示符来禁止它:
<%会话=“假”%>不存储在HttpSession中的大量数据,如:如果你存储在HttpSession中大型数据之类的,然后,只要是读,写,应用服务器将其序列化,从而增加了系统的额外负担。像更大的HttpSession中存储的数据,该系统的性能下降得更快。
当你不需要HttpSession中,尽快释放它:当你不再需要一个会话,您可以致电HttpSession.invalidate()方法来释放它。
尽可能的会话超时设置过短:在JSP应用服务器,默认的会话超时。当客户在此时间后,再没有会话的操作,系统会自动从内存中释放。超时设置就会越大系统的性能较低,所以最好的办法是要尽量保持在一个较低的水平及其价值。
方法4:页面输出压缩
压缩是解决数据冗余的一个好方法,尤其是在欠发达的网络带宽,今天。一些浏览器支持gzip(GNU zip的)压缩的HTML文件,这种方法可以大大减少HTML文件的下载时间。
因此,如果你的servlet或JSP页面生成的压缩的HTML页面,然后,用户会发现页面浏览速度是非常快的。不幸的是,并非所有浏览器都支持gzip压缩,但可以由客户在你的程序来检查浏览器是否支持它。下面是有关此方法的一个片段:
公共无效的doGet(HttpServletRequest的请求,HttpServletResponse的回应)=空字符串编码= request.getHeader(“的Accept-Encoding”)抛出IOException异常,ServletException {OutputStream的!(encoding! = NULL,&& encoding.indexOf(“gzip压缩”)= -1){request.setHeader(“内容编码”,使用“gzip”);出新的GZIPOutputStream的(request.getOutputStream());}!否则,如果(encoding!空&& encoding.indexOf的(“压缩”)= -1){request.setHeader(“内容编码”,“压缩”);出新ZIPOutputStream(request.getOutputStream());} {出= request.getOutputStream();} ......}方法5:使用线程池
默认的应用服务器为每个客户端请求创建一个线程处理,并为他们的service()方法,当service()方法调用完成分配,相应的线程也将被撤回。创建和撤消线程会消耗一定量的系统资源,降低系统的性能在此默认模式。但是,幸运的是,我们可以改变这种情况下,通过创建一个线程池。
此外,我们必须为这个线程池设置一个最小线程数和一个最大线程数。应用服务器启动时,它会创建一个数等于最低数量的线程,线程池,当客户的要求,相应的出池进行处理,处理完成时,然后英寸线程池线程如果线程池是不够的,系统会自动地增加池中线程的数量,但总不能超过最大线程数。通过使用线程池,当客户端请求在系统负荷剧增将呈现平稳上升的曲线,从而提高了系统的可扩展性。
方法6:选择正确的页面包含机制
有两种方法可以用来包含另一个JSP页面
1,使用include指令(<%@ includee文件“的test.jsp”%>)。
2,使用的JSP指标(<jsp:includee page="test.jsp" flush="true"/>)。
在实践中,我发现,如果使用第一种方法,可以使一个更高的系统性能。
方法7:确定的JavaBean的生命周期
在JSP的一个强大的地方是javabean的支持。在JSP页面中使用的<jsp:useBean>标签,JavaBean可以直接插入到一个JSP页面。其用途如下:
<jsp:useBean id="name" scope="page|request|session|application" class= "package.className" type="typeName"> </ JSP:useBean的scope属性指出了这个bean的生命周期。默认页面的生命周期。如果你没有选择权的bean的生命周期,它会影响系统的性能。
例如,如果你想使用bean的请求,但你却将会话bean的生命周期设置,这个请求结束时,这个bean将仍然保留在内存中,除非会话超时或用户关闭浏览器。这会消耗一些内存,并不必要地增加了JVM垃圾收集器的工作量。因此,设置正确的bean的生命周期,并尽快豆清洗他们的使命结束后,它会使用系统性能的改善。
其他一些有用的方法,尽可能的字符串串联操作不使用“+”操作符:在java编程中,我们经常使用“+”操作符连接多个字符串,但你可能从来没有想到这一点实际上对系统性能的影响?由于字符串是一个常量,因此JVM会产生一些临时对象。您可以使用“+”越多,像更使系统的性能将有一定的影响产生的暂时的。解决的办法是使用StringBuffer的,而不是像“+”操作符。
避免使用System.out.println()方法:由于对System.out.println()是一个同步调用,调用它,磁盘I / O操作必须等待它的完成,所以我们必须要尽量避免它调用。但我们在调试器中,它是一个重要的得心应手的工具,为了解决这个矛盾,我建议你使用Log4j工具http://Jakarta.apache.org;最好的,它可以方便调试,而不会产生系统通过out.println()这样的方式。
ServletOutputStream与PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它的原始输出转换为字符流输出,所以如果你使用它作为页面输出,那么系统必须支付一个转换过程。使用ServletOutputStream作为页面输出不存在问题,但它是一个二进制输出。为了在实际应用中的利弊权衡。
总结
Servlet和JSP调整技术,大大提高了应用程序的性能,从而提升整个J2EE应用的性能。通过这些调优技术,你可以发现,其实,不是一个技术平台(如J2EE和。NET的争议)确定应用程序的性能,重要的是你想有一个更深入的了解这个平台,所以可以从根本上优化的应用。[/size]