<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心的方向

    新的征途......
    posts - 75,comments - 19,trackbacks - 0
      轉(zhuǎn)自:http://blog.tostudy.com.cn/blog/show_3574.html

    優(yōu)化Web應(yīng)用的性能絕不象有些人想象的那樣簡單易行,它涉及到諸多技術(shù),從最簡單的HTML代碼修改,到復(fù)雜的EJB改造,無不涉及性能問題。但有一點是非常清楚的:要想找出和解決Web應(yīng)用的性能瓶頸,就必須深入全面地了解信息在Web應(yīng)用中的流程。

      改善Web應(yīng)用的性能不一定要局限于Web應(yīng)用的Java代碼,例如有些時候,簡單地改動一下HTML頁面的質(zhì)量、減少其傳輸頻度和數(shù)據(jù)量就可以有效地提高應(yīng)用的性能表現(xiàn);有時提高性能的關(guān)鍵卻在于修改Web應(yīng)用的數(shù)據(jù)庫訪問部分——這只是Java代碼之外影響性能的兩個因素,其他還有許多因素會影響到Web應(yīng)用的整體性能表現(xiàn)。另一方面,就Java程序本身而言,其性能優(yōu)化又可以分成三個領(lǐng)域:基本的Java代碼優(yōu)化,JSP/Servlet優(yōu)化,EJB優(yōu)化。

      一、表現(xiàn)層優(yōu)化

      Web應(yīng)用的最大性能瓶頸常常不在其他地方,而在于最基本的網(wǎng)絡(luò)帶寬限制。如果你的Web應(yīng)用也面臨這類問題,提高性能最簡單的辦法是減少HTTP傳輸,例如用JavaScript實現(xiàn)客戶端編輯功能以減少數(shù)據(jù)傳輸次數(shù),避免將數(shù)據(jù)發(fā)送到服務(wù)器端再執(zhí)行合法性驗證之類的編輯操作。

      應(yīng)當(dāng)采用一切可能措施減少通過網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)。例如,你可以要求瀏覽器緩沖模塊化的JavaScript文件,在SCRIPT標(biāo)記的SRC中指定:
    SCRIPT LANGUAGE="JavaScript" SRC="FormChek.js"。

      其他減少網(wǎng)絡(luò)傳輸應(yīng)當(dāng)注意的地方還包括:避免過度使用隱藏域,減少超長Cookie值,在RADIO、CHECKBOX和SELECT域中用代碼來替代長長的字符串,等等。不過在HTML優(yōu)化方面本文不準(zhǔn)備作全面的討論,因為WebSphere應(yīng)用的開發(fā)者一般不會擔(dān)負設(shè)計表現(xiàn)層的責(zé)任,只要了解下面這個原理就足夠了:

      性能技巧之一:盡可能減少HTTP數(shù)據(jù)傳輸?shù)目偭亢皖l度

      二、數(shù)據(jù)庫訪問

      朋友小A對Java的了解極為有限,但他卻成功地改進了許多WebSphere應(yīng)用的性能。他是怎么做到的呢?原來,小A是一個數(shù)據(jù)庫專家,他通過優(yōu)化數(shù)據(jù)庫訪問有效地改進了整個應(yīng)用的性能,但對于Java,他只是略微了解一些有關(guān)JDBC的知識。在優(yōu)化數(shù)據(jù)庫訪問時,小A做的第一件事情總是檢查數(shù)據(jù)庫的設(shè)計,有時他會建議重新構(gòu)造數(shù)據(jù)庫的結(jié)構(gòu)(必須指出的是,為了提高性能而重新構(gòu)造數(shù)據(jù)庫結(jié)構(gòu)有時可能使數(shù)據(jù)庫反規(guī)格化(De-Normalization),從而帶來維護方面的問題)。 
    性能技巧之二:規(guī)格化(Normalization)數(shù)據(jù)庫結(jié)構(gòu)

      小A做的第二件事情是執(zhí)行數(shù)據(jù)庫分析,根據(jù)分析結(jié)果提出增加某個索引、減少某個索引的建議。完成這一步驟后,小A通常可以讓應(yīng)用有令人滿意的性能表現(xiàn),根本不必去查看應(yīng)用的Java代碼。

      性能技巧之三:針對常用的SQL操作建立索引,刪除多余的索引

      有時,為了進一步優(yōu)化應(yīng)用的性能,小A會檢查Java(也許應(yīng)該說是SQL)代碼,經(jīng)常找到Java程序沒有合理運用PreparedStatement和連接緩沖池的情形。只要把Statement類的動態(tài)SQL替換成PreparedStatement類的靜態(tài)SQL,從連接池提取SQL連接(而不是直接創(chuàng)建連接),應(yīng)用的性能將得到顯著的改善。注意DB2 UDB(包括其他一些數(shù)據(jù)庫)的PreparedStatement是可調(diào)整和配置的。

      性能技巧之四:合理運用PreparedStatement和連接池

      進一步分析應(yīng)用的工作流程之后,小A有時會建議批量執(zhí)行某些SQL命令,這樣就只需一個對數(shù)據(jù)庫服務(wù)器的請求就可以運行大量的SQL命令。

      性能技巧之五:考慮批量執(zhí)行SQL命令

      既然如此,小A有時還會指出,如果應(yīng)用中有些SQL命令可以組合成單個事務(wù)邏輯,那么應(yīng)該可以用一個存儲過程來替代。DB2 UDB的存儲過程語言(SPL,Stored Procedure Language)非常強大,如果把數(shù)據(jù)庫操作邏輯從Web應(yīng)用轉(zhuǎn)移到數(shù)據(jù)庫,一般總是對性能有益。不過需要注意的是,雖然批量執(zhí)行SQL命令或使用存儲過程會提高性能,但就象重新構(gòu)造數(shù)據(jù)庫結(jié)構(gòu)一樣,有時會帶來維護方面的困難。

      性能技巧之六:考慮使用數(shù)據(jù)庫存儲過程

      檢查JDBC代碼的時候,小A總是留意對象有沒有及時正確釋放。這一點其實很重要。

      性能技巧之七:及時關(guān)閉不用的Statement、ResultSet、Connection等對象(但不是在finalize方法內(nèi))

    三、Java代碼

      前面我們以小A的經(jīng)驗為例,探討了Web應(yīng)用中數(shù)據(jù)庫訪問性能的重要性。調(diào)整好數(shù)據(jù)庫之后,接下來要做的自然是深入分析應(yīng)用的Java代碼。從哪里入手呢?你最好使用Java分析工具來找出性能問題的焦點所在。優(yōu)化Java代碼的性能是一個艱苦的過程,因此一個重要的原則是把精力集中到那些可能引起性能問題的代碼上。換句話說,就是要尊重80/20規(guī)則:利用Java分析工具的結(jié)果,調(diào)整帶來80%性能開銷的那20%代碼。

      性能技巧之八:用Java分析工具清楚地界定性能問題所在

      目前市場上已經(jīng)有許多優(yōu)秀的Java分析工具,例如ej-technologie的JProfile(http://www.ej-technologies.com),Klgroup的Jprobe(http://www.klg.com),以及Intuitive Systems的OptimizeIt(http://www.optimizeit.com)。不過不要忘記WebSphere Studio Application Developer(WSAD)本身也集成了一個優(yōu)秀的分析器,有條件的話,最好多用幾種分析工具分析Java代碼。

      考慮到資金問題,你不一定樂意購買昂貴的分析軟件,但你可以用Java本身的命令行工具生成分析信息。例如,在JDK 1.3中,你可以用下面的命令將TestOrderProcessing類的CPU使用情況保存到j(luò)ava.hprof文件:java -Xrunhprof:cpu=times,format=a,file=java.hprof TestOrderProcessing。

      這種辦法的缺點是它提供的信息條理不夠清楚,比較繁雜;也許可以找到一些源代碼開放的工具輔助分析,但一般不如使用WSAD本身的分析工具或商業(yè)化的分析工具方便。另外,如果你已經(jīng)了解哪些代碼塊可能引起性能問題,可以通過保存系統(tǒng)時間的方式獲得分析信息,例如:
    long startTime = System.currentTimeMillis();
    // 執(zhí)行某些操作
    long endTime = System.currentTimeMillis();

      3.1 基本篇

      有人建議“穩(wěn)定性第一,速度第二”,一般而言遵從這個建議是不會錯的,但這并不妨礙我們在編寫代碼的同時運用某些已經(jīng)證實的性能技巧。例如,我們都知道String類是不可變的,連接兩個String是一項開銷很大操作。

      性能技巧之九:用StringBuffer來連接兩個字符串

      也許你已經(jīng)注意到,SUN的許多標(biāo)準(zhǔn)Java類是線程安全的,這些類內(nèi)部的同步機制實際上很容易造成性能問題。例如,Vector類就是一個線程安全的類,除非確實要用到同步機制,否則使用Vector是不值得的,如有可能,應(yīng)當(dāng)盡量改用非線程安全的類如ArrayList。

      性能技巧之十:只有在必要時才運用線程安全的類

      許多人習(xí)慣使用System.out.println來輸出跟蹤信息,但println要占用不少資源,所以輸出跟蹤信息最好使用專用日志記錄框架,如IBM的JRas或Apache的Log4j。

      性能技巧之十一:用日志記錄框架類輸出跟蹤信息,而不是使用System.out.println

      最后一個提高代碼性能的簡單技巧是清除類里面的調(diào)試信息,減小類的體積。IBM有一個WSAD插件,它提供了一個叫做setDebugInfo的任務(wù),可以從Ant腳本調(diào)用。

      性能技巧之十二:從正式發(fā)行的軟件中刪除調(diào)試信息

    posted on 2008-04-08 13:03 阿偉 閱讀(202) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 亚洲动漫精品无码av天堂| 亚洲一区二区三区夜色| 久久久精品视频免费观看 | 亚洲国产精品成人一区| a级毛片免费观看视频| 亚洲国产成a人v在线| 四虎影永久在线高清免费| 久久免费视频观看| 久久精品国产亚洲AV忘忧草18| 国产一级理论免费版| 免费毛片a线观看| 亚洲精品国产suv一区88| 亚洲熟妇av一区二区三区漫画| 免费看男女下面日出水来| 国产精品亚洲а∨无码播放麻豆 | 亚洲日本久久一区二区va| 免费一级一片一毛片| 天天影院成人免费观看| 大片免费观看92在线视频线视频| 亚洲首页在线观看| 亚洲精品高清在线| 18禁成年无码免费网站无遮挡| 色www永久免费| 精品久久亚洲一级α| 911精品国产亚洲日本美国韩国| 亚洲成A∨人片天堂网无码| 在线观看www日本免费网站| www.av在线免费观看| 国产亚洲精品bv在线观看| 亚洲AV成人一区二区三区AV| 又粗又大又硬又爽的免费视频| 亚洲一级免费视频| 中文无码成人免费视频在线观看| 337P日本欧洲亚洲大胆艺术图| 亚洲国产日韩在线| 亚洲AV无码专区电影在线观看| 亚洲情a成黄在线观看| 日韩一品在线播放视频一品免费| 亚洲网站在线免费观看| 久久精品国产免费一区| 一区二区三区视频免费观看|