struts2的性能優化

轉自:http://blog.csdn.net/rick_123/article/details/6135467

前一段時間有反映說是一個使用了struts2的生產系統的頁面顯示速度太慢。登錄後發現確實如此,於是進行了一番性能調優的研究和
測試 。

    一,根據struts2官方的性能調優說明進行了一些參數的修改。

    http://struts.apache.org/2.x/docs/performance-tuning.html http://cwiki.apache.org/WW/performance-tuning.html

    Turn off logging and devMode.(關閉logging和Devmode)

    這個當然沒問題,但是全部關閉logging不現實,我只是關閉了struts2相關package的logging

    Do not use interceptors you do not need.把struts.xml中不需要的interceptor統統刪除

    Use the correct HTTP headers (Cache-Control & Expires)。

    不確定應該如何修改

    Copy the static content from the Struts 2 jar when using the Ajax theme (Dojo) or the Calendar tag.關於這點,後面會提到

    Create a freemarker.properties file in your WEB-INF/classes directory.照做

    Create the freemarker.properties file and add the following setting (or whatever value you deem fitting):template_update_delay=60000照做

    Enable Freemarker template caching As of Struts 2.0.10, setting the property struts.freemarker.templatesCache to true will enable the Struts internal caching of Freemarker templates. This property is set to false by default.照做

    進行上述修改後,發現頁面打開的速度並沒有明顯的提高。

    二,此時我已經基本鎖定網頁打開速度慢的原因與ajax(或者說是dojo)有關。因爲dojo的js庫大概有450K左右,先嚐試使用gzip壓縮 javascript,減小傳輸量,看能否加快頁面的加載速度在Tomcat的server.xml的connector中添加如下配置,激活gzip功能compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,application/x- javascript,application/javascript"進行上述修改後,發現頁面打開的速度還是沒有明顯的提高。

    三,經過上述兩個實驗,覺得應該是struts2所封閉的dojo的性能問題了。於是引入JQuery. JQuery的js文件最小是55K, gzip後應該更小,頁面的響應速度明顯改善(一個數量級以上的提高),主要原因在於與服務器 交互的處理上極大地提升了效率。而且頁面處理代碼更加簡潔明瞭。

    最後,我刪除了所有的<s:head theme="ajax"/>和 <s:head/>(如果頁面中加入<s:head />,那麼在Struts2生成的html中後包含dojo.js),使用JQuery來完成所有的Ajax和javascript功能。

最近,繼續研究了Struts2性能的調優方法,總結了一下,得出新三步曲:

4. 使用FreeMarker的最新版本2.3.13,因爲在版本2.3.11中,FreeMarker針對性能進行了改進,以下是 FreeMarker2.3.11的release notes:2.3.11 Date of release: 2007-12-04 This release contains several performance and usability improvements.

5. ognl2.7所稱ognl2.7相對於2.6在性能上有了“顯著”的提升,於是下載了2.7以及2.7所需要的javassist-3.8.0.GA.jar

其實,經過上面2個步驟,我並沒有發現應用的性能有顯著的改善,可能我的頁面中從ValueStack中的存取操作並不是特別多,也不是特別的複雜,所以,Ognl對我的影響並不明顯。

6. 最後使用了JProfiler對Tomcat進行了監控,最後發現問題在自定義模板上,我將頁面的自定義模板全部刪除,果然頁面的響應速度有了較大的提升。

通過上兩篇文章的研究,影響Struts2性能的原因在於Ognl的Value Stack的性能不佳。那麼如果解決呢:我首先嚐試使用JSF.一開始選擇JSF的原因主要是:

    1、Stuts2自己提供了JSF的Plugin2、JSF是Sun作爲標準提出,而且已經通過的。從Google的趨勢搜索上也可以看出,搜索JSF的人在增多。

    3、JSF作爲一種以組件爲基礎的Web Framework有其獨到之處,其內建的和其他許多開源的組件使用起來相當方便、強大。當然,對於不同的應用來說也有不利之處(後面會提到),但是如果能夠堅持長期使用,逐漸積累組件庫的話,JSF是一個很好的選擇。

    4、JSF的文檔(或者說是書籍)還是比較多的。

    經過測試 使用後,發現其性能與Struts2相比確實提升不少。但是後來遇到了一個問題,所以最後還是放棄了JSF.這個問題是關於JSF的DataTable 的,JSF提供的DataTable其實使用起來很方便,可定製化程度也不錯,只是剛好缺少了我所希望的功能(也可能是我不知道如何實現)。我的應用中的 DataTable是一個動態的結果集,也就是說輸出的列是不能預先確定的,而DataTable卻要求先聲明好所有的DataColumn,我不知道如何解決這個問題。所以最後放棄了JSF.我的第二個選擇是FreeMarker選擇FreeMarker的原因是:

    1、FreeMarker是Struts2缺少的模板引擎,Struts2的標籤大部分是使用FreeMarker的,使用FreeMarker的話,連Plugin都省去了。

    2、FreeMarker相對比較輕量級、因爲他本身只是一個模板引擎,與JSF這樣一個大而全的WebFramework相對,輕巧多了。

    3、FreeMarker的學習起來非常容易,只要把他網站上的Document過一遍,基本上就OK了。

    4、FreeMarker雖然體積小,功能還是相當強的,I18N,Converter之類的東西基本都全了,至少我所需要的功能全有。

    5、FreeMarker相當靈活,他不象JSF把底層的東西封裝了以後,暴露出一些屬性可以設置,如果你需要的屬性不能設置,你就沒有辦法了。在 FreeMarker你直接操作最底層的東西,擁有很大的靈活性。當然,犧牲了一些方便性,比如,要用FreeMarker生成一個下拉框,就需要較多的工作量了。

    測試 之後,使用FreeMarker的性能很不錯,在大數據量操作的情況下,至少一個數量級的性能提升。

    我的最終結論,如果要在Struts2中,展示或者操作大量數據,強烈推薦使用FreeMarker.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章