佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 通過JSP的預(yù)編譯消除性能瓶頸

通過JSP的預(yù)編譯消除性能瓶頸

熱門標(biāo)簽:銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 服務(wù)器配置 團(tuán)購網(wǎng)站 電子圍欄 科大訊飛語音識(shí)別系統(tǒng) Linux服務(wù)器 阿里云
歡迎來到“管理”這個(gè)版,新一期的月刊專欄專注于 WebLogic 服務(wù)器的管理、配置、處理和開發(fā)方面。

開辟這個(gè)專欄的目的是為了向大家介紹在使用WebLogic Sever時(shí),能普遍用到的非J2EE開發(fā)方面的問題。開發(fā)者和管理者同樣會(huì)發(fā)現(xiàn)這個(gè)專欄非常有價(jià)值,因?yàn)檫@些文章既適用于開發(fā)又適用于最終產(chǎn)品的應(yīng)用。此外,它很大程度上利用了來自于該領(lǐng)域和工程實(shí)驗(yàn)室的經(jīng)驗(yàn),它提供了對(duì)實(shí)際問題的詳細(xì)解答。

JSP預(yù)編譯的必要性

本月的文章著眼于移除潛在的系統(tǒng)性能瓶頸,它通過解決一個(gè)最普通的問題――在服務(wù)器運(yùn)行時(shí)間中的JSP (JavaServer Page)編譯的系統(tǒng)開銷問題,這個(gè)問題困擾著幾乎所有的J2EE發(fā)展計(jì)劃。雖然JSP是在J2EE應(yīng)用范圍內(nèi)呈現(xiàn)動(dòng)態(tài)HTML視圖的理想選擇,但在某種程度上它們會(huì)影響性能,這比錯(cuò)誤的更令人討厭,給人的第一感覺是該程序很慢。

根據(jù)J2EE規(guī)范,JSP主要是HTML文件,在它里面包含著Java代碼用來和其他的系統(tǒng)組件進(jìn)行交互以及動(dòng)態(tài)的顯示信息。規(guī)范規(guī)定所有的J2EE編譯應(yīng)用服務(wù)器應(yīng)當(dāng)支持JSP,客戶請(qǐng)求一個(gè)特定的JSP,將:

         轉(zhuǎn)換JSPHTML格式成為servlet類型的Java類(Java源格式),用簡(jiǎn)寫的JSP符號(hào)代替完全符合規(guī)定的Java語法

         將新產(chǎn)生的Java源文件編譯成.class字節(jié)碼形式

         在新編譯的類上執(zhí)行適當(dāng)?shù)慕涌诜椒ú⑶覍?duì)客戶端請(qǐng)求返回響應(yīng)。

雖然從發(fā)展的觀點(diǎn)來看對(duì)于在表示層內(nèi)管理動(dòng)態(tài)HTML的產(chǎn)生這是最好的途徑,但它影響到服務(wù)器的運(yùn)行時(shí)間環(huán)境,要求JSP被解析、轉(zhuǎn)變成Java代碼,并且在它去處理一個(gè)特定的客戶端請(qǐng)求之前被編譯。對(duì)最終用戶明顯的影響是,一個(gè)響應(yīng)將會(huì)被延遲知道給定的JSP文件被編譯通過。考慮到一個(gè)特定的用戶請(qǐng)求可能用到兩個(gè)或多個(gè)JSP文件,因此編譯狀態(tài)必需的時(shí)間增加了很多倍。

對(duì)第一個(gè)請(qǐng)求一個(gè)特定的JSP頁面并且迫使被請(qǐng)求的文件進(jìn)行初始編譯的終端用戶,會(huì)感覺應(yīng)用程序很慢并且沒有響應(yīng)。 雖然這樣的感覺可能存在,但是對(duì)于特定的JSP文件的編譯過程通常在給定的應(yīng)用服務(wù)器虛擬機(jī)實(shí)例的生命周期中完成一次。 因此,它對(duì)性能總體上的影響被考慮成一種障礙,而不是對(duì)應(yīng)用程序總響應(yīng)時(shí)間的一個(gè)嚴(yán)重的障礙。然而,在生產(chǎn)環(huán)境中為了傳送基于JSPJ2EE應(yīng)用程序的生產(chǎn)系統(tǒng),必須克服JSP的缺陷并且對(duì)最終用戶進(jìn)行透明的編譯。

這樣生產(chǎn)環(huán)境如何能受益于JSP文件,還要避免運(yùn)行時(shí)編譯的性能打擊?答案是簡(jiǎn)單的執(zhí)行一個(gè)一般作為JSP預(yù)編譯的過程。 借用JSP預(yù)編譯,已經(jīng)被預(yù)編譯的在脫機(jī)環(huán)境中的JSP文件和他們的編譯結(jié)果被部署在生產(chǎn)環(huán)境中。如果結(jié)果類文件的預(yù)編譯和部署正確的完成,應(yīng)用程序服務(wù)器將會(huì)為JSP文件運(yùn)行先前的編譯類,并且在運(yùn)行中將不強(qiáng)制對(duì)特定的請(qǐng)求進(jìn)行再編譯。 這樣產(chǎn)生了一種情況,應(yīng)用程序的操作避免了多余的編譯開銷,允許系統(tǒng)管理員移除對(duì)系統(tǒng)總性能會(huì)造成影響的一個(gè)已知的瓶頸。

不同的方法論和途徑

沒有人懷疑JSP預(yù)編譯的承諾聽起來令人興奮。 然而,為了要實(shí)現(xiàn)這樣的承諾,你必須首先了解能夠執(zhí)行這個(gè)技術(shù)的不同途徑,以及它們各自優(yōu)點(diǎn)和缺點(diǎn)。

運(yùn)行應(yīng)用程序進(jìn)行強(qiáng)制預(yù)編譯

用于實(shí)現(xiàn)JSP預(yù)編譯最顯而易見的方法是在產(chǎn)品發(fā)布前,通過請(qǐng)求在應(yīng)用程序中的所有可能的JSP頁面,因此編譯在終端用戶訪問站點(diǎn)前完成。它既可以通過第一次人工瀏覽整個(gè)站點(diǎn)時(shí)完成也可以通過從測(cè)試系列應(yīng)用程序或其他腳本語言的客戶端(例如LoadRunner SilkPerformer)發(fā)動(dòng)自動(dòng)請(qǐng)求來實(shí)現(xiàn)。 當(dāng)使用這種方法(可能是所有的JSP預(yù)編譯方法中的最簡(jiǎn)單的而又較下策的一個(gè)方法)時(shí),他的缺點(diǎn)很快就顯現(xiàn)出來了。也許最大的缺點(diǎn)是很難實(shí)現(xiàn)跨集群環(huán)境,在集群環(huán)境中,用該方法對(duì)于單一節(jié)點(diǎn)的實(shí)例發(fā)送的請(qǐng)求依集群中的節(jié)點(diǎn)數(shù)量成倍的增加。而且,當(dāng)這個(gè)集群是由一個(gè)或更多的Web服務(wù)器或硬件負(fù)載權(quán)衡者來代理時(shí),更難保證在一個(gè)集群的環(huán)境中每個(gè)服務(wù)器實(shí)例都進(jìn)行JSP預(yù)編譯,因?yàn)橐话銢]有方法來搞清代理最初把請(qǐng)求轉(zhuǎn)到哪個(gè)應(yīng)用服務(wù)器。此外,在應(yīng)用服務(wù)器每次重啟時(shí),這個(gè)方法必須執(zhí)行,當(dāng)站點(diǎn)很小時(shí),不能一次實(shí)現(xiàn)所有的編譯就會(huì)很痛苦。因此,我們不推薦這種JSP預(yù)編譯的方法。

使用編譯工具來實(shí)現(xiàn)預(yù)編譯

因?yàn)槿斯?zhí)行一個(gè)站點(diǎn)應(yīng)用程序來強(qiáng)制JSP預(yù)編譯在真實(shí)的產(chǎn)品環(huán)境中是一個(gè)較大的缺點(diǎn),在預(yù)編譯運(yùn)行期間選擇編譯JSP,使其變成為servlets變得更令人心動(dòng)。幸運(yùn)地,WLS提供了二個(gè)方法。第一種方法在服務(wù)器啟動(dòng)部署一個(gè)特定的Web應(yīng)用程序的時(shí)候執(zhí)行預(yù)編譯(declarative預(yù)編譯),第二種方法是命令行Java工具(weblogic.jspc)允許過程在完全脫機(jī)的情況下處理(程序方式的預(yù)編譯)。兩種方法都有它們的優(yōu)點(diǎn),程序方式的預(yù)編譯在兩者中有更靈活的選項(xiàng),并且提供更讓人無法抗拒的理由來使用它。

DECLARATIVE預(yù)編譯

對(duì)于在WLS下公布的預(yù)編譯,一個(gè)特定的Web應(yīng)用程序(獨(dú)立的或者作為EAR的一部分)能夠被配置,因此所有的JSP在應(yīng)用程序部署(服務(wù)器啟動(dòng)時(shí))和重新部署(運(yùn)行時(shí))期間里被預(yù)編譯。對(duì)WEB-INF/ weblogic.xml部署描述符要做必要的配置變化,使用預(yù)編譯jsp-param/>指令,如下:

weblogic-web-app>

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

/weblogic-web-app>

在一個(gè)特定的Web應(yīng)用程序上進(jìn)行部署(或重新部署),如果上述的參數(shù)被設(shè)定成真, WLS 將會(huì)在WAR內(nèi)嘗試預(yù)編譯所有的JSP文件,在程序中從 Web 應(yīng)用程序的根目錄下循環(huán)的運(yùn)行它的方法( 略過Web-INF) 。以. jsp .JSP為擴(kuò)展名的文件都變成了編譯的對(duì)象。 被編譯后的文件被以適當(dāng)?shù)陌夸浗Y(jié)構(gòu)形式被放置在Web 應(yīng)用程序的臨時(shí)工作目錄下面(默認(rèn)在Web-INF子目錄中,除非在 weblogic.xml 里有特別說明)。

這個(gè)方法是到目前為止進(jìn)行JSP預(yù)編譯最方便的途徑(“flick-a-switch” 途徑),他有許多指出來毫無意義的缺點(diǎn)。如果一個(gè)錯(cuò)誤在JSP的編譯期間或在部署(或重新部署) 的時(shí)候發(fā)生,Web 應(yīng)用程序的預(yù)編譯將會(huì)在例外處暫停。另外,如果在一個(gè)特定的Web應(yīng)用程序里面有許多JSP文件的情況,declarative預(yù)編譯顯著的影響著部署時(shí)間,阻斷部署直到所有的文件都被編譯。對(duì)于大型的應(yīng)用程序,當(dāng)出現(xiàn)數(shù)以百計(jì)的JSP 文件以declarative預(yù)編譯被執(zhí)行的時(shí)候,這種部署時(shí)間趨向以分鐘來計(jì)算 (在某些情況1015分鐘,其他情況可能更長時(shí)間)。設(shè)想開始一個(gè)服務(wù)器實(shí)例,在一個(gè)特定的Web應(yīng)用程序周期內(nèi)進(jìn)入部署狀態(tài)用declarative 預(yù)編譯激活。如果在應(yīng)用內(nèi)有很多的JSP文件以及部署,接近完成時(shí)就已經(jīng)花費(fèi)了大量的時(shí)間,在編譯期間由于拋出一個(gè)例外而突然失敗,當(dāng)然會(huì)引起挫折感。雖然起先看起來比較方便,但declarative 編譯對(duì)生產(chǎn)系統(tǒng)管理造成重大的風(fēng)險(xiǎn),因此應(yīng)該在經(jīng)過慎重的考慮后再使用它。

程序方式的預(yù)編譯

WLS下最可靠的預(yù)編譯JSP的方法是使用Java命令行weblogic.jspc,它位于WLS安裝的lib目錄之下的weblogic.jar文件中。這個(gè)工具允許開發(fā)者在發(fā)展階段和在部署前解決編譯時(shí)間問題的時(shí)候編譯需要的JSP文件。它也為生產(chǎn)系統(tǒng)提供一個(gè)有能力實(shí)現(xiàn)JSP預(yù)編譯的管理員。這種用法的主要好處是:

         文件可以被預(yù)編譯一次然后可以被多次部署。(這不被服務(wù)器實(shí)例的重復(fù)利用所影響

         編譯時(shí)的例外可以被預(yù)先解決而不影響部署。

         類可以通過集群部署。

使用weblogic.jspc的缺點(diǎn)是需要人工干涉,并且它在開發(fā)時(shí)并當(dāng)在JSP文件變得過時(shí)的時(shí)候必須被重新運(yùn)行。然而,考慮到前面的兩個(gè)方法的討論,我們幾乎不能將這種不方便當(dāng)成該方法的一個(gè)缺點(diǎn),因此推薦它作為最可靠和最靈活的機(jī)制來實(shí)現(xiàn)JSP預(yù)編譯。

執(zhí)行weblogic.jspc

為了更有效的使用weblogic.jspc,你必須首先了解它的用法和語法。這篇文章我們將利用WLS6.1 SP2的工具的功能。注意:下面給出的語法和最好的慣例應(yīng)該應(yīng)用于WLS 6.1的所有版本以及新的WLS 7.0。

為了調(diào)用命令行JSP編譯器(weblogic.jspc),你必須確定下面的內(nèi)容:

         PATH環(huán)境變量必須包含你機(jī)器上安裝的J2SE1.3包的二進(jìn)制目錄(例如,/opt/j2se/1.3.1/sdk/bin 或者c:\sunsoft\j2se\1.3.1\sdk\bin),以獲得JVM運(yùn)行時(shí)的支持。如果你打算使用javac作為你的JSP編譯的Java編譯器,要確定PATH包含全部Java 1.3 的軟件開發(fā)工具包(SDK)的二進(jìn)制目錄,并且不僅僅是JREJava Runtime Engine,Java運(yùn)行時(shí)間引擎),因?yàn)闆]有編譯器和JRE關(guān)聯(lián)。 如果你打算使用一個(gè)編譯器而不是javac(例如 Jikes),也要為那個(gè)編譯器確定在PATH中包含正確的目錄。

         設(shè)置Java系統(tǒng)類路徑用來包含來自WLS 6.1 SP2 安裝目錄的weblogic.jar文件,通過在產(chǎn)品庫目錄下默認(rèn)建立(例如,/opt/bea/wlserver6.1/lib/weblogic.jar或者c:\bea\wlserv  -er6.1\lib\weblogic.jar)。此外,請(qǐng)確定在JSP編譯階段中你可能需要的參考類(JAR或類文件)也在你的類路徑中。

在第一次執(zhí)行weblogic.jspc之前,你需要測(cè)試你的命令行配置是否是按上述配置。它可以通過簡(jiǎn)單運(yùn)行一個(gè)WLS版本檢查來完成,使用命令“java weblogic.version”,這個(gè)命令應(yīng)該返回下面的內(nèi)容:

which should return 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

如果你的輸出和上面的不相似(和你運(yùn)行的版本相對(duì)應(yīng)),在進(jìn)行JSP預(yù)編譯前,要重新訪問PATH和類路徑變量將其設(shè)置成你的當(dāng)前命令行環(huán)境。

一般的weblogic.jspc的語法如下面給出的:

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

在一個(gè)編譯器的單一調(diào)用中默認(rèn)情況下JSP編譯器可以編譯一個(gè)JSP文件或一組JSP文件,并且可以通過設(shè)置命令行選項(xiàng),編譯器可以以不同的方法工作。下面給出一個(gè)例子:

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

這篇文章只列舉了一個(gè)例子,如果你要想更加了解weblogic.jspc如何能在你的環(huán)境中使用和管理的話,請(qǐng)參閱www.slackwerks.com/wldj,我們提供了對(duì)整套的工作選項(xiàng),使用的含義以及相關(guān)聯(lián)問題的討論。

結(jié)論

雖然關(guān)于JSP預(yù)編譯的問題較多,但許多的途徑可以解決。然而,考慮到上文所說的那些優(yōu)點(diǎn)和缺點(diǎn),應(yīng)該較容易的看出經(jīng)由weblogic.jspc預(yù)編譯的程序方式是為克服JSP固有的缺點(diǎn)的一個(gè)靈活的選項(xiàng)。在開發(fā)階段的早期,熟悉該工具將改善生產(chǎn)期間應(yīng)用程序的管理和性能狀況。

您可能感興趣的文章:
  • 淺析JavaScript預(yù)編譯和暗示全局變量
  • 實(shí)例講解JavaScript預(yù)編譯流程
  • JavaScript 詳解預(yù)編譯原理
  • JavaScript運(yùn)行過程中的“預(yù)編譯階段”和“執(zhí)行階段”
  • 一起來了解一下JavaScript的預(yù)編譯(小結(jié))

標(biāo)簽:廣元 棗莊 蚌埠 大理 萍鄉(xiāng) 衢州 江蘇 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《通過JSP的預(yù)編譯消除性能瓶頸》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    孟村| 安平县| 大邑县| 漾濞| 阿坝县| 海兴县| 山阳县| 巫山县| 大名县| 巴南区| 楚雄市| 东阳市| 昭通市| 荃湾区| 白河县| 武夷山市| 长白| 久治县| 岐山县| 哈尔滨市| 温州市| 玉田县| 敖汉旗| 湘西| 洞头县| 霍州市| 河池市| 申扎县| 溆浦县| 永修县| 安义县| 于都县| 乌兰察布市| 厦门市| 开远市| 兴山县| 泽州县| 大厂| 建德市| 奉贤区| 长海县|