你的J2EE應(yīng)用是不是運(yùn)行的很慢?它們能不能承受住不斷上升的訪問量?本文講述了開發(fā)高性能、高彈性的JSP頁(yè)面和Servlet的性能優(yōu)化技術(shù)。其意思是建立盡可能快的并能適應(yīng)數(shù)量增長(zhǎng)的用戶及其請(qǐng)求。在本文中,我將帶領(lǐng)你學(xué)習(xí)已經(jīng)實(shí)踐和得到證實(shí)的性能調(diào)整技術(shù),它將大大地提高你的servlet和jsp頁(yè)面的性能,進(jìn)而提升J2EE的性能。這些技術(shù)的部分用于開發(fā)階段,例如,設(shè)計(jì)和編碼階段。另一部分技術(shù)則與配置相關(guān)。
技術(shù)1:在HttpServletinit()方法中緩存數(shù)據(jù)
服務(wù)器會(huì)在創(chuàng)建servlet實(shí)例之后和servlet處理任何請(qǐng)求之前調(diào)用servlet的init()方法。該方法在servlet的生命周期中僅調(diào)用一次。為了提高性能,在init()中緩存靜態(tài)數(shù)據(jù)或完成要在初始化期間完成的代價(jià)昂貴的操作。例如,一個(gè)最佳實(shí)踐是使用實(shí)現(xiàn)了javax.sql.DataSource接口的JDBC連接池。
DataSource從JNDI樹中獲得。每調(diào)用一次SQL就要使用JNDI查找DataSource是非常昂貴的工作,而且嚴(yán)重影響了應(yīng)用的性能。Servlet的init()方法可以用于獲取DataSource并緩存它以便之后的重用:
publicclassControllerServletextendsHttpServlet
{
privatejavax.sql.DataSourcetestDS=null;
publicvoidinit(ServletConfigconfig)throwsServletException
{
super.init(config);
Contextctx=null;
try
{
ctx=newInitialContext();
testDS=(javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingExceptionne)
{
ne.printStackTrace();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
publicjavax.sql.DataSourcegetTestDS()
{
returntestDS;
}
...
...
}
技術(shù)2:禁用servlet和Jsp的自動(dòng)裝載功能
當(dāng)每次修改了Servlet/JSP之后,你將不得不重新啟動(dòng)服務(wù)器。由于自動(dòng)裝載功能減少開發(fā)時(shí)間,該功能被認(rèn)為在開發(fā)階段是非常有用的。但是,它在運(yùn)行階段是非常昂貴的;servlet/JSP由于不必要的裝載,增加類裝載器的負(fù)擔(dān)而造成很差的性能。同樣,這會(huì)使你的應(yīng)用由于已被某種類裝載器裝載的類不能和當(dāng)前類裝載器裝載的類不能相互協(xié)作而出現(xiàn)奇怪的沖突現(xiàn)象。因此,在運(yùn)行環(huán)境中為了得到更好的性能,關(guān)閉servlet/JSP的自動(dòng)裝載功能。
技術(shù)3:控制HttpSession
許多應(yīng)用需要一系列客戶端的請(qǐng)求,因此他們能互相相關(guān)聯(lián)。由于HTTP協(xié)議是無(wú)狀態(tài)的,所以基于Web的應(yīng)用需要負(fù)責(zé)維護(hù)這樣一個(gè)叫做session的狀態(tài)。為了支持必須維護(hù)狀態(tài)的應(yīng)用,Javaservlet技術(shù)提供了管理session和允許多種機(jī)制實(shí)現(xiàn)session的API。HttpSession對(duì)象扮演了session,但是使用它需要成本。無(wú)論何時(shí)HttpSession被使用和重寫,它都由servlet讀取。你可以通過使用下面的技術(shù)來(lái)提高性能:
l在JSP頁(yè)面中不要?jiǎng)?chuàng)建默認(rèn)的HttpSession:默認(rèn)情況下,JSP頁(yè)面創(chuàng)建HttpSession。如果你在JSP頁(yè)面中不用HttpSession,為了節(jié)省性能開銷,使用下邊的頁(yè)面指令可以避免自動(dòng)創(chuàng)建HttpSession對(duì)象:
新聞熱點(diǎn)
疑難解答
圖片精選