JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
己加入精華區
by browser at 2005-12-16 16:08
本主題所含的標籤
無標籤
作者 JSP & Servlets 效能調校提示 [精華]
je





發文: 112
積分: 2
於 2005-12-16 15:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
本文譯自:
Six Steps to Faster J2EE Apps: Performance Tuning with JSP and Servlets
http://javaboutique.internet.com/tutorials/tuning/

----------------------------------------------------------------
本文:
 你的 J2EE 應用程式是否能承受同時大量的客戶端請求?抑或它已經運作得越來越慢,且回應時間越拖越久了呢?這類的效能瓶頸可能源自多重原因。以下提供六項簡單的提示以加速您的應用程式,您可將其套用在專案的設計或開發階段。
 

提示一 採用正確的 Include 機制

 有兩種方法可以 include 檔案在 JSP 中:

1. Include directive(<%@include file="test.jsp" %>):
  在編譯階段,當頁面被轉換成 Servlet 時,檔案(test.jsp)的內容就會被讀進來。(譯註:為靜態載入,只能包含檔案但不能包含 URL 或接參數)

2. Include action(<jsp:include page="test.jsp" flush="true" />):
  在執行時期,等到 user 的 request 產生時才讀取檔案內容。(譯註:亦即可動態載入,並自行判斷是否也將 test.jsp 編譯執行)

 Include directive 的速度會比 Include action 快,因為包含的過程是靜態的,被包含的頁面在執行過程不需要被編譯,也因此不用在伺服端做處理(除了將該頁面傳回客戶端時)。如果你的檔案不常更動內容,或其並非動態頁面,使用 Include directive 將可獲得一些效能增益。
 

提示二 在 useBean Action 中使用正確的 Scope

 JSP 可將現存的程式碼放在 JavaBeans 之中以便重複使用,將其嵌入頁面的語法如下:
1
<jsp:useBean id="name" scope="request|page|session|application" class="package.className" type="typeName" />

重點在 scope 屬性,若未指定的話預設值為 page,而選擇正確的 scope 將有助於運作效能。舉例而言,如果你只是為了一次特定的 request 而使用 bean,但卻將 scope 設為 session,即便該 request 生命週期已結束,但物件仍會一直存留在記憶體中。除非你明確地用 invalidate() 方法移除掉 session,或等到 session 的生命週期完結(譯註:1800秒)。

(譯註:亦可呼叫 removeAttribute() 移除 session 中的屬性,在此例中即指 JavaBeans。或是呼叫 sexMaxInactiveInterval(),以設定 session 在一定的時間內沒有作用就過期)
 

提示三 用 HttpServlet 的 init() 方法將資料快取

 在 Servlet 的 instance 被建立後,以及任何客戶端 requests 被處理之前,Servlet 的 init() 方法會被伺服器呼叫,且其在 Servlet 的生命週期中只會被呼叫一次。因此,若把一些初始化、或較消耗系統資源的動作放在 init() 方法中來處理,將可得到較佳之運作效能。比方說 Connection pooling 就很適合放在此一方法中,我們可以建立與設定需要的 connections 數目以便之後重複使用。

(譯註 1:相對於 Servlet 第一次啟動時會自動被執行的 init(),亦有 Servlet 被 destroy 時會自動被執行的 destroy() 方法)
(譯註 2:JSP 另有功能類似的 jspInit()、jspDestroy(),可將一些希望一定會被執行,但只被執行一次的程式碼放置其中)
(譯註 3:下方程式碼為該文所附,以 JNDI 查 DataSource 的程式碼)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TaskServlet extends HttpServlet {
 
  private javax.sql.DataSource dataSource = null;
 
  public void init(ServletConfig config) throws ServletException {
    super.init(config); 
    Context context = null;
    try { 
      context = new InitialContext();
      dataSource = (javax.sql.DataSource)context.lookup("jdbc/dataSource");
    } catch(NamingException namingException) {
      namingException.printStackTrace(); 
    } catch(Exception exception) {
      exception.printStackTrace();
    }
  }
 
  public java.sql.Connection getConnection() {
    // 從 dataSource 回傳 connection
  }
 
  // 其它功能的程式碼
}

 

提示四 停用 JSP & Servlets 的 Auto-Reloading 功能

 Auto-reloading 功能,省去了我們每次修改 JSP & Servlet 後必須重新啟動伺服器的麻煩。但是由於該功能會包含額外的動作和非必要的 loading,以致於對 Classloader 和系統效能造成影響,甚至於可能造成不可預期的 class 衝突。例如較早的 Classloader 所載入的 class,可能無法和目前 Classloader 載入的 class 協同運作。因此建議在系統的開發階段以及系統上線後,都將該功能關閉。

(譯註:Auto-Reloading 應該是指 Container 中 server.xml 所設定的 <Context …… reloadable="true">,在一些 Web Container 例如 Tomcat 的說明檔中,{%CATALINA_HOME%}\webapps\tomcat-docs\config\context.html,也有提到該功能有助於開發階段的測試工作,但因會造成系統負擔,因此不建議在部署後仍使用,因此該功能預設為關閉的。但仍有所謂的 Manager web app 功能,以便系統上線後仍舊能依需要而觸發 reloading 動作,詳情請參閱書籍或您 Web Container 的說明檔。而在本討論區中也有相關論述:
http://www.javaworld.com.tw/jute/post/view?bid=9&id=56779&sty=3&keywords=reloading
有人認為在系統開發階段應開啟該項功能以便測試,但正式上線後則應關閉以免影響運作效能)
 

提示五 管理 Session

 大部份應用程式都需要 Session 來維持客戶端 request 的連串運作,Servlet 也提供了相關 API 以作 Session 的管理。但是使用 HttpSession 物件來管理 Sessions,多少會消耗一些應用程式的效能。

 所有的 JSP 頁面預設都會建立一個 HttpSession 的 instance,以幫助我們呼叫和決定是否要使用。然而當我們不需要該功能時,就應該避免去建立它(譯註:Session 功能預設是開啟的),並以下列的程式碼來要求伺服器不要建立 Session:
1
<%@ page session="false"%>

 另一個應避免使用 HttpSession 的原因,是因為只要有任一個 request 產生,HttpSession 物件都會被運作處理。要是我們將大型物件儲存於其中,將會造成效能上的瓶頸。如果我們非用 HttpSession 不可,至少應該避免將大型物件存在裡面。

 事實上,讓 Session 持續一直運作是不明智的,將其生命週期依應用程式需求設定得較短些,將有助於整體的運作效能。而且有一點永遠要記得的,就是當不再需要使用 Session 時,應該用 HttpSession 的 invalidate() 方法將其移除,以便從記憶體中釋放掉。
 

提示六 使用 gzip 壓縮

 壓縮功能可讓資料體積縮小,其規格有很多種,這裡所要介紹的為 gzip(GNU zip)。目前大部份的瀏覽器都支援 gzip,將資料以該規格先壓縮過將可加快傳送速度。以下為範例程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
                           throws IOException, ServletException {
 
  OutputStream out = null;
 
  // 檢查客戶端瀏覽器是否支援該規格
  // 我們可以用 HTTP request 的 Accepting-Encoding header 來做檢查
  // 如果 header(表頭)包含 gzip,就選擇用 GZIP,否則不要壓縮
 
  String encoding = httpServletRequest.getHeader("Accept-Encoding"); 
 
  if (encoding != null && encoding.indexOf("gzip") != -1) {        // 若瀏覽器支援壓縮,也支援 gzip
    httpServletResponse.setHeader("Content-Encoding" , "gzip");
    out = new GZIPOutputStream(httpServletResponse.getOutputStream());
  } else if (encoding != null && encoding.indexOf("compress") != -1) { // 若瀏覽器支援壓縮,但不支援 gzip
    httpServletResponse.setHeader("Content-Encoding" , "compress");
    out = new ZIPOutputStream(httpServletResponse.getOutputStream());
  } else {
    out = httpServletResponse.getOutputStream();
  }
 
  // 其它功能的程式碼
}

(譯註 :本功能譯者自己未曾試過,有興趣者可自行測試看看)
 

譯者的結論(原文無結論):

 由於 JSP 中資料的傳遞皆為字串,且 JSP 擁有廣大的類別函式庫支援,因此亦需更注意各種型別之間轉換所消耗掉的效能,包括基本型別、字串、物件、Wrapper Class 之間的轉換皆然。而不論是自動轉型、強制轉型(Casting)、用 Java 內建的 method 轉型,或 Java 5.0 提供的 Autoboxing/Unboxing,小弟我認為仍都應儘可能減少使用,因為只要有轉型的動作,或多或少都會消耗效能和記憶體。此外,要扔到資料庫中去查詢的 SQL 敘述句,亦應注意大量字串串接對效能的影響,雖然 .NET 和 Java 的 StringBuilder 和 StringBuffer 類別的物件,無法直接用在 SQL 敘述句中去資料庫裡撈資料,但仍有折衷的做法,亦即先用 StringBuffer 的 append() 串接之後,再以 toString() 轉為 String 型別。

 越強大的程式語言,程式員就越應小心去運用它。而有關 Java/JSP 效能調校的技巧還有很多,本文亦僅能作重點提示。


je edited on 2005-12-16 17:57
reply to postreply to post
臉書「資料庫之道」粉絲團:
http://www.facebook.com/DBtaoist
話題樹型展開
人氣 標題 作者 字數 發文時間
10831 [精華] JSP & Servlets 效能調校提示 je 5430 2005-12-16 15:34
9166 Re:JSP & Servlets 效能調校提示 hkdennis2k 1929 2005-12-16 21:49
7002 Re:JSP & Servlets 效能調校提示 frex 250 2007-03-13 21:33
8579 Re:JSP & Servlets 效能調校提示 je 160 2005-12-17 00:07
8717 Re:JSP & Servlets 效能調校提示 hkdennis2k 110 2005-12-17 00:14
6961 Re:JSP & Servlets 效能調校提示 lijie250 26 2007-03-31 01:42
» JWorld@TW »  Servlet/JSP 討論區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8