你的J2EE應用是不是啟動並執行很慢?它們能不能承受住不斷上升的訪問量?本文講述了開發高效能、高彈性的JSP頁面和Servlet的效能最佳化技術。其意思是建立儘可能快的並能適應數量增長的使用者及其請求。在本文中,我將帶領你學習已經實踐和得到證實的效能調整技術,它將大大地提高你的servlet和jsp頁面的效能,進而提升J2EE的效能。這些技術的部分用於開發階段,例如,設計和編碼階段。另一部分技術則與配置相關。
技術1:在HttpServletinit()方法中快取資料
伺服器會在建立servlet執行個體之後和servlet處理任何請求之前調用servlet的init()方法。該方法在servlet的生命週期中僅調用一次。為了提高效能,在init()中緩衝待用資料或完成要在初始化期間完成的代價昂貴的操作。例如,一個最佳實務是使用實現了javax.sql.DataSource介面的JDBC串連池。
DataSource從JNDI樹中獲得。每調用一次SQL就要使用JNDI尋找DataSource是非常昂貴的工作,而且嚴重影響了應用的效能。Servlet的init()方法可以用於擷取DataSource並緩衝它以便之後的重用:
public class ControllerServlet extends HttpServlet{
private javax.sql.DataSource testDS = null;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
Context ctx = null;
try
{
ctx = new InitialContext();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingException ne)
{
ne.printStackTrace();
}
catch(Exception e) { e.printStackTrace();
}
}
public javax.sql.DataSource getTestDS()
{
return testDS;
}
...
...
}
技術2:禁用servlet和Jsp的自動裝載功能
當每次修改了Servlet/JSP之後,你將不得不重新啟動伺服器。由於自動裝載功能減少開發時間,該功能被認為在開發階段是非常有用的。但是,它在運行階段是非常昂貴的;servlet/JSP由於不必要的裝載,增加類裝載器的負擔而造成很差的效能。同樣,這會使你的應用由於已被某種類裝載器裝載的類不能和當前類裝載器裝載的類不能相互協作而出現奇怪的衝突現象。因此,在運行環境中為了得到更好的效能,關閉servlet/JSP的自動裝載功能。
技術3:控制HttpSession
許多應用需要一系列用戶端的請求,因此他們能互相相關聯。由於HTTP協議是無狀態的,所以基於Web的應用需要負責維護這樣一個叫做session的狀態。為了支援必須維護狀態的應用,Javaservlet技術提供了管理session和允許多種機制實現session的API。HttpSession對象扮演了session,但是使用它需要成本。無論何時HttpSession被使用和重寫,它都由servlet讀取。你可以通過使用下面的技術來提高效能:
l在JSP頁面中不要建立預設的HttpSession:預設情況下,JSP頁面建立HttpSession。如果你在JSP頁面中不用HttpSession,為了節省效能開銷,使用下邊的頁面指令可以避免自動建立HttpSession對象:
<%@ page session="false"%>
1) 不要將大的對象圖儲存在HttpSession中:如果你將資料當作一個大的對象圖儲存在HttpSession中,應用伺服器每次將不得不處理整個HttpSession對象。這將迫使Java序列化和增加計算開銷。由於序列化的開銷,隨著儲存在HttpSession對象中資料對象的增大,系統的輸送量將會下降。
2) 用完後釋放HttpSession:當不在使用HttpSession時,使用HttpSession.invalidate()方法使sesion失效。
3) 設定逾時值:一個servlet引擎有一個預設的逾時值。如果你不刪除session或者一直把session用到它逾時的時候,servlet引擎將把session從記憶體中刪除。由於在記憶體和垃圾收集上的開銷,session的逾時值越大,它對系統彈性和效能的影響也越大。試著將session的逾時值設定的儘可能低。