BEA WebLogic平臺下J2EE調優攻略(2)
1.3 Web代碼調優
1.3.1 HttpSession的使用
應用服務器保存很多會話時,容易造成內存不足,所以盡量減少session的使用,放置session
里的對象不應該是大對象,最好是簡單小對象,實現串行化接口。當會話不再需要時,應當及時
調用invalidate()方法清除會話。而當某
個變量不需要時,及時調用removeAttribute()方法清除變量。請勿將EJB對象放置在session中。
1.3.2 JSP代碼調優
目前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動作。
include指令:例如,該指令在編譯時引入指定的資源。在編譯之前,帶有include指令的頁面和指定的
資源被合并成一個文件。被引用的外部資源在編譯時就確定,比運行時才確定資源更高效。
include動作:例如。該動作引入指定頁面執行后生成的結果
由于它在運行時完成,因此對輸出結果
的控制更加靈活。但是,只有當被引用的內容頻繁地改變時,或者在對主頁面的請求沒有出現之前,被
引用的頁面無法確定時,使用include動作才合算。
對于那些無需跟蹤會話狀態的jsp,關閉自動創建的會話可以節省一些資源。使用如下page指令
: ;盡量不要將JSP頁面定義為單線程,應設置為;在JSP頁面最好使用輸出緩存功能,如: ;盡
量用wl:cache定制標記來緩存靜態或相對
靜態的內容,緩存jsp:include操作的結果能顯著提高應用程序的運行性能。
1.3.3 Servlet代碼調優
Servlet代碼調優比較簡單:在Servlet之間跳轉時,forward比sendRedirect更有效;設置
HttpServletResponse 緩沖區,如:response.setBufferSize(20000);在init()方法里緩存靜態數據,
而在destroy()中釋放它;建議在 Servlet里使用ServletOutputStream輸出圖片等對象;避免在Servlet
和Jsp中定界事務等。
1.4 JMS代碼調優
1.4.1 注意必要的事項,避免使用不必要的特征
JMS提供了強有力的消息處理機制,但是為了最大限度的提高JMS系統的性能,應避免使用不需要
使用的特征,同時也要注意必要的事項。
比如:盡量使用接收程序能直接使用的最簡單、最小的消息類型;消息選擇器要盡可能簡單(最好不使用
),盡量不要使用復雜的操作符,如like、in或者between 等,使用字符串數據類型的速度最慢;務必為特
定的應用程序定義特定的JMS連接工廠,并且禁用默認的JMS連接工廠;不要在javax.*與 php?name=web">weblogic.*的
名字空間中使用JNDI名稱;盡量使用異步消費者,線程不必封鎖以等待消息的到達;使用完JNDI樹上的資
源后注意關閉。
1.4.2 消息類型的選擇
標準JMS提供了五種消息類型,而TextMessage應用最為普遍, 當發送的消息是幾種原始數據類型
的集合體時,最好使用MapMessage消息類型,而不要使用ObjectMessage,以便減少不
同系統間的耦合。此外消息是否使用壓縮
要慎重考慮,壓縮未必能減少消息大小。如果生產者、消費者和目的地并置在同一WebLogic Server內部
,通常不使用壓縮。WebLogic特有的XMLMessage能為運行于消息主體之上的消息選擇器提供內嵌式支持
,而且易于數據交換。因此,建議應用程序之間傳送消息使用XML消息格式,而應用程序內部間傳送消息
使用二進制消息格式。
1.4.3 確認方式的選擇和JMS事務
使用事務性會話時,盡量使用恰當的消息確認方式:如果需求允許,使用NO_ACKKNOWLEDGE;非持久的訂閱者使用
DUPS_OK_ACKNOWLEDGE或者MULTICAST_NO_ACKNOWLEDGE。而使用JTA的UserTransaction,確認方式將被忽
略。在使用JMS事務時,無效的消息會導致事務的回滾,以致消息重發這樣的死循環。此時,可以將無效
消息發送到錯誤消息隊列,并提交JMS事務,這將確保消息不會再次傳遞。
1.5 EJB代碼調優
1.5.1 有效使用設計模式
GoF 的《設計模式》為我們實現高性能、易擴展的J2EE應用提供理論保障和技術支持。而EJB作
為J2EE的核心組件和技術,善用設計模式對系統性能影響很大。Service Locator 和Value Object 已為
我們所熟悉,Floyd Marinescu的《EJB
Design Patterns》中的Session Fa?ade、Message Fa?ade、EJB Command和Data Transfer Object等設
計模式更是為我們提供設計典范:緩存對EJBHome的訪問;使用門面模式,不暴露Entity Bean,用
Session Bean封裝Entity Bean;如果可以異步處理,則用MDB代替Session Bean;封裝業務邏輯在輕量
級JavaBean中;使用值對象等簡單對象傳遞數據;不直接使用get/set方法操作Entity Bean。當然過度使
用模式或者牽強套用模式也是不提倡的,總的原則就是減少網絡流量,改進事務管理。
1.5.2 使用EJB和WebLogic的特性
使用EJB和WebLogic的新特性往往能提高性能。與EJB2.0特性相關的技巧有:一個Application中
使用本地接口,對于 Entity Bean肯定使
用本地接口,避免遠程調用的開銷;使用CMP管理關系,而不是BMP,EJB2.0中CMP的性能大大改善,性能
和移植性都優于BMP;使用ejbSelect進行內部查詢;使用home方法進行外部查詢和批處理; 數據庫驅動
級聯刪除等。
與WebLogic特性相關的技巧有:使用自動生成主鍵,WebLogic為Oracle和Sqlserver兩種數據庫的
CMP提供了自動生成主鍵功能,節約了Entity Bean產生主鍵的時間,同時設key-cache-size不小于
100;WebLogic管理事務性能更好,使用容
器管理,而不是Bean管理事務;WebLogic提供了為CMP動態查詢和批量插入功能,對性能也有很大幫助。
1.5.3 緩存資源
對SLSB或者MDB來說,使用setMesssageDrivenContext()或者ejbCreate()方法緩存特定資源,在
ejbRemove()方法里釋放; 對SLSB或者MDB來說,使用setSessionContext()或者ejbCreate()方法緩存特定
資源,在ejbRemove()方法里釋放;對Entity Bean來說,使用setEntityContext ()方法緩存特定資源,在
unSetEntityContext ()方法里釋放。
1.5.4 如何選擇和使用Entity Bean
1. 在設計EJB時,要適當考慮EJB的粒度, 細粒度的EJB在事務管理和資源管理的開銷太大,盡量
創建粗粒度的 EJB , 不要太粗,粗到能
滿足實際需求就可以;
2. Entity Bean不是唯一方式,如果只有一個很小的數據子集被經常改變,建議采用JDO;
3. 在操作大數據量的時候,直接采用JDBC比Entity Bean更有效;
4. 避免采用返回很大數據組的finder方法,如 FindAll() 方法,因為它的實現代價太大;
5. 考慮設置域組field groups,減少沒有必要并昂貴的屬性加載,如BLOB;
6. 對于EJB1.1或者BMP,可以設置
is-modified-method-name屬性,根據isModified()的值來判斷是否調用ejbStore()等方法,減少沒有必要
運算;
7. 避免連接多個表創建BMP,可以使用視圖,存儲過程或者O/R Mapping等方式。
1.5.5 其他的一些小技巧
1. 考慮使用 javax.ejb.SessionSynchronization 接口,提供在Rollback之后恢復數據的方法:
afterBegin(), beforeCompletion(), afterCompletion();
2. 使用完SFSB之后,調用remove()方法釋放實例;
3. 假如你不需要EJB服務的時候,建議使用普通Java類;
4. 避免EJB之間相互調用;
5. 使用多讀模式。
1.3.1 HttpSession的使用
應用服務器保存很多會話時,容易造成內存不足,所以盡量減少session的使用,放置session
里的對象不應該是大對象,最好是簡單小對象,實現串行化接口。當會話不再需要時,應當及時
調用invalidate()方法清除會話。而當某
個變量不需要時,及時調用removeAttribute()方法清除變量。請勿將EJB對象放置在session中。
1.3.2 JSP代碼調優
目前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動作。
include指令:例如,該指令在編譯時引入指定的資源。在編譯之前,帶有include指令的頁面和指定的
資源被合并成一個文件。被引用的外部資源在編譯時就確定,比運行時才確定資源更高效。
include動作:例如。該動作引入指定頁面執行后生成的結果
由于它在運行時完成,因此對輸出結果
的控制更加靈活。但是,只有當被引用的內容頻繁地改變時,或者在對主頁面的請求沒有出現之前,被
引用的頁面無法確定時,使用include動作才合算。
對于那些無需跟蹤會話狀態的jsp,關閉自動創建的會話可以節省一些資源。使用如下page指令
: ;盡量不要將JSP頁面定義為單線程,應設置為;在JSP頁面最好使用輸出緩存功能,如: ;盡
量用wl:cache定制標記來緩存靜態或相對
靜態的內容,緩存jsp:include操作的結果能顯著提高應用程序的運行性能。
1.3.3 Servlet代碼調優
Servlet代碼調優比較簡單:在Servlet之間跳轉時,forward比sendRedirect更有效;設置
HttpServletResponse 緩沖區,如:response.setBufferSize(20000);在init()方法里緩存靜態數據,
而在destroy()中釋放它;建議在 Servlet里使用ServletOutputStream輸出圖片等對象;避免在Servlet
和Jsp中定界事務等。
1.4 JMS代碼調優
1.4.1 注意必要的事項,避免使用不必要的特征
JMS提供了強有力的消息處理機制,但是為了最大限度的提高JMS系統的性能,應避免使用不需要
使用的特征,同時也要注意必要的事項。
比如:盡量使用接收程序能直接使用的最簡單、最小的消息類型;消息選擇器要盡可能簡單(最好不使用
),盡量不要使用復雜的操作符,如like、in或者between 等,使用字符串數據類型的速度最慢;務必為特
定的應用程序定義特定的JMS連接工廠,并且禁用默認的JMS連接工廠;不要在javax.*與 php?name=web">weblogic.*的
名字空間中使用JNDI名稱;盡量使用異步消費者,線程不必封鎖以等待消息的到達;使用完JNDI樹上的資
源后注意關閉。
1.4.2 消息類型的選擇
標準JMS提供了五種消息類型,而TextMessage應用最為普遍, 當發送的消息是幾種原始數據類型
的集合體時,最好使用MapMessage消息類型,而不要使用ObjectMessage,以便減少不
同系統間的耦合。此外消息是否使用壓縮
要慎重考慮,壓縮未必能減少消息大小。如果生產者、消費者和目的地并置在同一WebLogic Server內部
,通常不使用壓縮。WebLogic特有的XMLMessage能為運行于消息主體之上的消息選擇器提供內嵌式支持
,而且易于數據交換。因此,建議應用程序之間傳送消息使用XML消息格式,而應用程序內部間傳送消息
使用二進制消息格式。
1.4.3 確認方式的選擇和JMS事務
使用事務性會話時,盡量使用恰當的消息確認方式:如果需求允許,使用NO_ACKKNOWLEDGE;非持久的訂閱者使用
DUPS_OK_ACKNOWLEDGE或者MULTICAST_NO_ACKNOWLEDGE。而使用JTA的UserTransaction,確認方式將被忽
略。在使用JMS事務時,無效的消息會導致事務的回滾,以致消息重發這樣的死循環。此時,可以將無效
消息發送到錯誤消息隊列,并提交JMS事務,這將確保消息不會再次傳遞。
1.5 EJB代碼調優
1.5.1 有效使用設計模式
GoF 的《設計模式》為我們實現高性能、易擴展的J2EE應用提供理論保障和技術支持。而EJB作
為J2EE的核心組件和技術,善用設計模式對系統性能影響很大。Service Locator 和Value Object 已為
我們所熟悉,Floyd Marinescu的《EJB
Design Patterns》中的Session Fa?ade、Message Fa?ade、EJB Command和Data Transfer Object等設
計模式更是為我們提供設計典范:緩存對EJBHome的訪問;使用門面模式,不暴露Entity Bean,用
Session Bean封裝Entity Bean;如果可以異步處理,則用MDB代替Session Bean;封裝業務邏輯在輕量
級JavaBean中;使用值對象等簡單對象傳遞數據;不直接使用get/set方法操作Entity Bean。當然過度使
用模式或者牽強套用模式也是不提倡的,總的原則就是減少網絡流量,改進事務管理。
1.5.2 使用EJB和WebLogic的特性
使用EJB和WebLogic的新特性往往能提高性能。與EJB2.0特性相關的技巧有:一個Application中
使用本地接口,對于 Entity Bean肯定使
用本地接口,避免遠程調用的開銷;使用CMP管理關系,而不是BMP,EJB2.0中CMP的性能大大改善,性能
和移植性都優于BMP;使用ejbSelect進行內部查詢;使用home方法進行外部查詢和批處理; 數據庫驅動
級聯刪除等。
與WebLogic特性相關的技巧有:使用自動生成主鍵,WebLogic為Oracle和Sqlserver兩種數據庫的
CMP提供了自動生成主鍵功能,節約了Entity Bean產生主鍵的時間,同時設key-cache-size不小于
100;WebLogic管理事務性能更好,使用容
器管理,而不是Bean管理事務;WebLogic提供了為CMP動態查詢和批量插入功能,對性能也有很大幫助。
1.5.3 緩存資源
對SLSB或者MDB來說,使用setMesssageDrivenContext()或者ejbCreate()方法緩存特定資源,在
ejbRemove()方法里釋放; 對SLSB或者MDB來說,使用setSessionContext()或者ejbCreate()方法緩存特定
資源,在ejbRemove()方法里釋放;對Entity Bean來說,使用setEntityContext ()方法緩存特定資源,在
unSetEntityContext ()方法里釋放。
1.5.4 如何選擇和使用Entity Bean
1. 在設計EJB時,要適當考慮EJB的粒度, 細粒度的EJB在事務管理和資源管理的開銷太大,盡量
創建粗粒度的 EJB , 不要太粗,粗到能
滿足實際需求就可以;
2. Entity Bean不是唯一方式,如果只有一個很小的數據子集被經常改變,建議采用JDO;
3. 在操作大數據量的時候,直接采用JDBC比Entity Bean更有效;
4. 避免采用返回很大數據組的finder方法,如 FindAll() 方法,因為它的實現代價太大;
5. 考慮設置域組field groups,減少沒有必要并昂貴的屬性加載,如BLOB;
6. 對于EJB1.1或者BMP,可以設置
is-modified-method-name屬性,根據isModified()的值來判斷是否調用ejbStore()等方法,減少沒有必要
運算;
7. 避免連接多個表創建BMP,可以使用視圖,存儲過程或者O/R Mapping等方式。
1.5.5 其他的一些小技巧
1. 考慮使用 javax.ejb.SessionSynchronization 接口,提供在Rollback之后恢復數據的方法:
afterBegin(), beforeCompletion(), afterCompletion();
2. 使用完SFSB之后,調用remove()方法釋放實例;
3. 假如你不需要EJB服務的時候,建議使用普通Java類;
4. 避免EJB之間相互調用;
5. 使用多讀模式。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/