Struts2性能問題的最終解決方法
Posted on 2008-09-02 21:02 云自無心水自閑 閱讀(5453) 評論(5) 編輯 收藏 所屬分類: Java 、心得體會 、Struts2通過上兩篇文章的研究,
詳見:
我的struts2項目性能調優三步曲:http://www.aygfsteel.com/usherlight/archive/2008/07/01/211869.html
我的struts2項目性能調優三步曲(續):http://www.aygfsteel.com/usherlight/archive/2008/07/12/214462.html
得出的結論是:影響Struts2性能的原因在于Ognl的Value Stack的性能不佳。那么如果解決呢:
* 我首先嘗試使用JSF。
一開始選擇JSF的原因主要是:
1、Stuts2自己提供了JSF的Plugin
2、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的性能很不錯,在大數據量操作的情況下,至少一個數量級的性能提升。
主要原因是freeMarker的值直接從action中取得的,所以避開了ognl的stack value.
* 我的最終結論,如果要在Struts2中,展示或者操作大量數據,強烈推薦使用FreeMarker。