jsp预编译:使用窍门技巧:通过JSP预编译消除性能瓶颈

欢迎来到“管理角”这个版月刊专栏专注于 WebLogic 服务器管理、配置、处理和开发方面

开辟这个专栏是为了向大家介绍在使用WebLogic Sever时能普遍用到非J2EE开发方面问题开发者和管理者同样会发现这个专栏非常有价值这些文章既适用于开发又适用于最终产品应用此外它很大程度上利用了来自于该领域和工程实验室经验它提供了对实际问题详细解答

JSP预编译必要性

本文着眼于移除潜在系统性能瓶颈它通过解决个最普通问题??在服务器运行时间中JSP (JavaServer Page)编译系统开销问题这个问题困扰着几乎所有J2EE发展计划虽然JSP是在J2EE应用范围内呈现动态HTML视图理想选择但在某种程度上它们会影响性能这比更令人讨厌给人感觉是该很慢

根据J2EE规范标准JSP主要是HTML文件在它里面包含着Java代码用来和其他系统组件进行交互以及动态显示信息规范标准规定所有J2EE编译应用服务器应当支持JSP客户请求个特定JSP将:

● 转换JSP从HTML格式成为servlet类型Java类(Java源格式)用简写JSP符号代替完全符合规定Java语法

● 将新产生Java源文件编译成.字节码形式

● 在新编译类上执行适当接口思路方法并且对客户端请求返回响应

虽然从发展观点来看对于在表示层内管理动态HTML产生这是最好途径但它影响到服务器运行时间环境要求JSP被解析、转变成Java代码并且在它去处理个特定客户端请求的前被编译对最终用户明显影响是个响应将会被延迟知道给定JSP文件被编译通过考虑到个特定用户请求可能用到两个或多个JSP文件因此编译状态必需时间增加了很多倍

对第个请求个特定JSP页面并且迫使被请求文件进行编译终端用户会感觉应用很慢并且没有响应虽然这样感觉可能存在但是对于特定JSP文件编译过程通常在给定应用服务器虚拟机例子生命周期中完成因此它对性能总体上影响被考虑成种障碍而不是对应用总响应时间个严重障碍然而在生产环境中为了传送基于JSPJ2EE应用生产系统必须克服JSP缺陷并且对最终用户进行透明编译

这样生产环境如何能受益于JSP文件还要避免运行时编译性能打击?答案是简单:执行般作为JSP预编译过程借用JSP预编译已经被预编译在脱机环境中JSP文件和他们编译结果被部署在生产环境中如果结果类文件预编译和部署正确完成应用服务器将会为JSP文件运行先前编译类并且在运行中将不强制对特定请求进行再编译这样产生了种情况应用操作避免了多余编译开销允许系统管理员移除对系统总性能会造成影响个已知瓶颈

区别思路方法论和途径

没有人怀疑JSP预编译承诺听起来令人兴奋 然而为了要实现这样承诺你必须首先了解能够执行这个技术区别途径以及它们各自优点和缺点

运行应用进行强制预编译

用于实现JSP预编译最显而易见思路方法是在产品发布前通过请求在应用所有可能JSP页面因此编译在终端用户访问站点前完成它既可以通过第次人工浏览整个站点时完成也可以通过从测试系列应用或其他脚本语言客户端(例如LoadRunner 或 SilkPerformer)发动自动请求来实现当使用这种思路方法(可能是所有JSP预编译思路方法中最简单而又较下策个思路方法)时缺点很快就显现出来了也许最大缺点是很难实现跨集群环境在集群环境中用该思路方法对于单节点例子发送请求依集群中节点数量成倍增加而且当这个集群是由个或更多Web服务器或硬件负载权衡者来代理时更难保证在个集群环境中每个服务器例子都进行JSP预编译般没有思路方法来搞清代理最初把请求转到哪个应用服务器此外在应用服务器每次重启时这个思路方法必须执行当站点很小时不能次实现所有编译就会很痛苦因此我们不推荐这种JSP预编译思路方法

使用编译工具来实现预编译

人工执行个站点应用来强制JSP预编译在真实产品环境中是个较大缺点在预编译运行期间选择编译JSP使其变成为servlets变得更令人心动幸运地WLS提供了 2个思路方法种思路方法在服务器启动部署个特定 Web应用时候执行预编译(declarative预编译)第 2种思路方法是命令行Java工具(weblogic.jspc)允许过程在完全脱机情况下处理(方式预编译)两种思路方法都有它们优点方式预编译在两者中有更灵活选项并且提供更让人无法抗拒理由来使用它

DECLARATIVE预编译

对于在WLS下公布预编译个特定Web应用(独立或者作为EAR部分)能够被配置因此所有JSP在应用部署(服务器启动时)和重新部署(运行时)期间里被预编译对WEB-INF/ weblogic.xml部署描述符要做必要配置变化使用预编译指令如下:

<weblogic-web-app>

<jsp-descriptor>
<jsp-param>
<param-name>precompile</param-name>
<param-value>true</param-value>
</jsp-param>
</jsp-descriptor>

</weblogic-web-app>

个特定Web应用上进行部署(或重新部署)如果上述参数被设定成真 WLS 将会在WAR内尝试预编译所有JSP文件中从 Web 应用根目录下循环运行它思路方法( 略过Web-INF) 以. jsp 或 .JSP为扩展名文件都变成了编译对象 被编译后文件被以适当包目录结构形式被放置在Web 应用临时工作目录下面(默认在Web-INF子目录中除非在 weblogic.xml 里有特别介绍说明)

这个思路方法是到目前为止进行JSP预编译最方便途径(“flick-a- switch” 途径)他有许多指出来毫无意义缺点如果在JSP编译期间或在部署(或重新部署) 时候发生Web 应用预编译将会在例外处暂停另外如果在个特定Web应用里面有许多JSP文件情况declarative预编译显著影响着部署时间阻断部署直到所有文件都被编译对于大型应用当出现数以百计JSP 文件以declarative预编译被执行时候这种部署时间趋向以分钟来计算 (在某些情况10到15分钟其他情况可能更长时间)设想开始个服务器例子个特定Web应用周期内进入部署状态用declarative 预编译激活如果在应用内有很多JSP文件以及部署接近完成时就已经花费了大量时间在编译期间由于抛出个例外而突然失败当然会引起挫折感虽然起先看起来比较方便但declarative 编译对生产系统管理造成重大风险因此应该在经过慎重考虑后再使用它

方式预编译

在WLS下最可靠预编译JSP思路方法是使用Java命令行weblogic.jspc它位于WLS安装lib目录的下weblogic.jar文件中这个工具允许开发者在发展阶段和在部署前解决编译时间问题时候编译需要JSP文件它也为生产系统提供个有能力实现JSP预编译管理员这种使用方法主要好处是:

● 文件可以被预编译次然后可以被多次部署(这不被服务器例子重复利用所影响)

● 编译时例外可以被预先解决而不影响部署

● 类可以通过集群部署

使用weblogic.jspc缺点是需要人工干涉并且它在开发时并当在JSP文件变得过时时候必须被重新运行然而考虑到前面两个思路方法讨论我们几乎不能将这种不方便当成该思路方法个缺点因此推荐它作为最可靠和最灵活机制来实现JSP预编译

执行weblogic.jspc

为了更有效使用weblogic.jspc你必须首先了解它使用方法和语法这篇文章我们将利用WLS6.1 SP2工具功能注意:下面给出语法和最好惯例应该应用于WLS 6.1所有版本以及新WLS 7.0

为了命令行JSP编译器(weblogic.jspc)你必须确定下面内容:

● PATH环境变量必须包含你机器上安装J2SE1.3包 2进制目录(例如/opt/j2se/1.3.1/sdk/bin 或者c:sunsoftj2se1.3.1sdkin)以获得JVM运行时支持如果你打算使用javac作为你JSP编译Java编译器要确定PATH包含全部Java 1.3 软件Software开发工具包(SDK) 2进制目录并且不仅仅是JRE(Java Runtime EngineJava运行时间引擎)没有编译器和JRE关联 如果你打算使用个编译器而不是javac(例如 Jikes)也要为那个编译器确定在PATH中包含正确目录

● 设置Java系统类路径用来包含来自WLS 6.1 SP2 安装目录weblogic.jar文件通过在产品库目录下默认建立(例如/opt/bea/wlserver6.1/lib /weblogic.jar或者c:eawlserv -er6.1libweblogic.jar)此外请确定在JSP编译阶段中你可能需要参考类(JAR或类文件)也在你类路径中

在第次执行weblogic.jspc的前你需要测试你命令行配置是否是按上述配置它可以通过简单运行个WLS版本检查来完成使用命令“java weblogic.version”这个命令应该返回下面内容:

which should the following:

WebLogic Server 6.1 SP2 12/18/2001 11:13:46

#154529

WebLogic XML Module 6.1 SP2 12/18/2001

11:28:02 #154529

如果你输出和上面不相似(和你运行版本相对应)在进行JSP预编译前要重新访问PATH和类路径变量将其设置成你当前命令行环境

weblogic.jspc语法如下面给出:

java weblogic.jspc [options] < jsp files >...

个编译器中默认情况下JSP编译器可以编译个JSP文件或组JSP文件并且可以通过设置命令行选项编译器可以以区别思路方法工作下面给出个例子:

java
weblogic.jspc
-webapp mywebapp
-compiler javac
-compileFlags "-g"
-path /u/apps/dist/src/lib.jar
-d .
-package com.slackwerks.mywebapp.jsp
-commentary
-keepgenerated
-k
mywebappindex.jsp

结论

虽然有关JSP预编译问题较多但许多途径可以解决然而考虑到上文所说那些优点和缺点应该较容易看出经由weblogic.jspc预编译方式是为克服JSP固有缺点个灵活选项在开发阶段早期熟悉该工具将改善生产期间应用管理和性能状况

Tags:  性能瓶颈 jsp预编译

延伸阅读

最新评论

发表评论