優化Web應用的性能絕不象有些人想象的那樣簡單易行
它涉及到諸多技術
從最簡單的HTML代碼修改
到復雜的EJB改造
無不涉及性能問題
但有一點是非常清楚的
要想找出和解決Web應用的性能瓶頸
就必須深入全面地了解信息在Web應用中的流程
改善Web應用的性能不一定要局限於Web應用的Java代碼
例如有些時候
簡單地改動一下HTML頁面的質量
減少其傳輸頻度和數據量就可以有效地提高應用的性能表現
有時提高性能的關鍵卻在於修改Web應用的數據庫訪問部分——這只是Java代碼之外影響性能的兩個因素
其他還有許多因素會影響到Web應用的整體性能表現
另一方面
就Java程序本身而言
其性能優化又可以分成三個領域
基本的Java代碼優化
JSP/Servlet優化
EJB優化
一
表現層優化
Web應用的最大性能瓶頸常常不在其他地方
而在於最基本的網絡帶寬限制
如果你的Web應用也面臨這類問題
提高性能最簡單的辦法是減少HTTP傳輸
例如用JavaScript實現客戶端編輯功能以減少數據傳輸次數
避免將數據發送到服務器端再執行合法性驗證之類的編輯操作
應當采用一切可能措施減少通過網絡傳輸的數據
例如
你可以要求浏覽器緩沖模塊化的JavaScript文件
在SCRIPT標記的SRC中指定
SCRIPT LANGUAGE=
JavaScript
SRC=
FormChek
js
其他減少網絡傳輸應當注意的地方還包括
避免過度使用隱藏域
減少超長Cookie值
在RADIO
CHECKBOX和SELECT域中用代碼來替代長長的字符串
等等
不過在HTML優化方面本文不准備作全面的討論
因為WebSphere應用的開發者一般不會擔負設計表現層的責任
只要了解下面這個原理就足夠了
性能技巧之一
盡可能減少HTTP數據傳輸的總量和頻度
二
數據庫訪問
朋友小A對Java的了解極為有限
但他卻成功地改進了許多WebSphere應用的性能
他是怎麼做到的呢?原來
小A是一個數據庫專家
他通過優化數據庫訪問有效地改進了整個應用的性能
但對於Java
他只是略微了解一些有關JDBC的知識
在優化數據庫訪問時
小A做的第一件事情總是檢查數據庫的設計
有時他會建議重新構造數據庫的結構(必須指出的是
為了提高性能而重新構造數據庫結構有時可能使數據庫反規格化(De
Normalization)
從而帶來維護方面的問題)
性能技巧之二
規格化(Normalization)數據庫結構
小A做的第二件事情是執行數據庫分析
根據分析結果提出增加某個索引
減少某個索引的建議
完成這一步驟後
小A通常可以讓應用有令人滿意的性能表現
根本不必去查看應用的Java代碼
性能技巧之三
針對常用的SQL操作建立索引
刪除多余的索引
有時
為了進一步優化應用的性能
小A會檢查Java(也許應該說是SQL)代碼
經常找到Java程序沒有合理運用PreparedStatement和連接緩沖池的情形
只要把Statement類的動態SQL替換成PreparedStatement類的靜態SQL
從連接池提取SQL連接(而不是直接創建連接)
應用的性能將得到顯著的改善
注意DB
UDB(包括其他一些數據庫)的PreparedStatement是可調整和配置的
性能技巧之四
合理運用PreparedStatement和連接池
進一步分析應用的工作流程之後
小A有時會建議批量執行某些SQL命令
這樣就只需一個對數據庫服務器的請求就可以運行大量的SQL命令
性能技巧之五
考慮批量執行SQL命令
既然如此
小A有時還會指出
如果應用中有些SQL命令可以組合成單個事務邏輯
那麼應該可以用一個存儲過程來替代
DB
UDB的存儲過程語言(SPL
Stored Procedure Language)非常強大
如果把數據庫操作邏輯從Web應用轉移到數據庫
一般總是對性能有益
不過需要注意的是
雖然批量執行SQL命令或使用存儲過程會提高性能
但就象重新構造數據庫結構一樣
有時會帶來維護方面的困難
性能技巧之六
考慮使用數據庫存儲過程
檢查JDBC代碼的時候
小A總是留意對象有沒有及時正確釋放
這一點其實很重要
性能技巧之七
及時關閉不用的Statement
ResultSet
Connection等對象(但不是在finalize方法內)
三
Java代碼
前面我們以小A的經驗為例
探討了Web應用中數據庫訪問性能的重要性
調整好數據庫之後
接下來要做的自然是深入分析應用的Java代碼
從哪裡入手呢?你最好使用Java分析工具來找出性能問題的焦點所在
優化Java代碼的性能是一個艱苦的過程
因此一個重要的原則是把精力集中到那些可能引起性能問題的代碼上
換句話說
就是要尊重
/
規則
利用Java分析工具的結果
調整帶來
%性能開銷的那
%代碼
性能技巧之八
用Java分析工具清楚地界定性能問題所在
目前市場上已經有許多優秀的Java分析工具
例如ej
technologie的JProfile()
Klgroup的Jprobe()
以及Intuitive Systems的OptimizeIt()
不過不要忘記WebSphere Studio Application Developer(WSAD)本身也集成了一個優秀的分析器
有條件的話
最好多用幾種分析工具分析Java代碼
考慮到資金問題
你不一定樂意購買昂貴的分析軟件
但你可以用Java本身的命令行工具生成分析信息
例如
在JDK
中
你可以用下面的命令將TestOrderProcessing類的CPU使用情況保存到java
hprof文件
java
Xrunhprof:cpu=times
format=a
file=java
hprof TestOrderProcessing
這種辦法的缺點是它提供的信息條理不夠清楚
比較繁雜
也許可以找到一些源代碼開放的工具輔助分析
但一般不如使用WSAD本身的分析工具或商業化的分析工具方便
另外
如果你已經了解哪些代碼塊可能引起性能問題
可以通過保存系統時間的方式獲得分析信息
例如
long startTime = System
currentTimeMillis();
// 執行某些操作
long endTime = System
currentTimeMillis();
基本篇
有人建議
穩定性第一
速度第二
一般而言遵從這個建議是不會錯的
但這並不妨礙我們在編寫代碼的同時運用某些已經證實的性能技巧
例如
我們都知道String類是不可變的
連接兩個String是一項開銷很大操作
性能技巧之九
用StringBuffer來連接兩個字符串
也許你已經注意到
Sun的許多標准Java類是線程安全的
這些類內部的同步機制實際上很容易造成性能問題
例如
Vector類就是一個線程安全的類
除非確實要用到同步機制
否則使用Vector是不值得的
如有可能
應當盡量改用非線程安全的類如ArrayList
性能技巧之十
只有在必要時才運用線程安全的類
許多人習慣使用System
out
println來輸出跟蹤信息
但println要占用不少資源
所以輸出跟蹤信息最好使用專用日志記錄框架
如IBM的JRas或Apache的Log
j
性能技巧之十一
用日志記錄框架類輸出跟蹤信息
而不是使用System
out
println
最後一個提高代碼性能的簡單技巧是清除類裡面的調試信息
減小類的體積
IBM有一個WSAD插件
它提供了一個叫做setDebugInfo的任務
可以從Ant腳本調用
性能技巧之十二
從正式發行的軟件中刪除調試信息
From:http://tw.wingwit.com/Article/program/Oracle/201311/18198.html