国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

Servlet和JSP 性能調整技術

2024-09-05 00:20:05
字體:
來源:轉載
供稿:網友

商業源碼熱門下載www.html.org.cn

  概述

在本文中, rahul chaudhary將描述性能調整技術 (ptt performance-tuning techniques) 的使用,來提升servlets 和jsp 的性能,以此來提升你的j2ee應用的性能。筆者假設讀者具有基礎的servlets 和jsps知識。

你的j2ee應用程序運行緩慢么?它們可以滿足足夠的壓力么?本文將會描述如何在開發高性能的應用和jsp以及servlets中使用性能調整技術 (ptt performance-tuning techniques)。使用這些技術可以構建更加快速、穩健的系統,以滿足更多用戶或者更多請求的需要。在本文中,我將會帶你進行實際的實踐,試驗如何調整性能提升你的servlets 和 jsp 頁面緩慢的性能,最終以提升你的j2ee應用的性能。其中一部分技術使用在開發過程階段,也就是說,適應于在你進行系統設計或者編寫代碼的時候。另外一些則是和配置相關技術。

調整方法1:使用 httpservlet init()方法緩存數據

應用服務器在servlet開始構造的時候,接受處理任何請求之前調用servlet的init()方法。在servlet的生命周期中僅僅調用一次。init()方法通過緩存靜態數據或者完成占用大量資源的操作,用來在初始化的過程中提高性能。

舉例說明,通過使用jdbc連接池是一個最好的實踐,在調用javax.sql.datasource接口的時候。依靠通過jndi(java命名和服務接口)樹獲得datasource.如果在每一次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后不用重新啟動服務??墒牵谏a環境下面,卻是占用大量開銷,因為進行了沒有必要的重新載入的操作,所以帶來了很懷的性能影響。同時,在部分類載入,部分為載入的時候也可能帶來各種奇怪的沖突。因此在j2ee的生產環境下關閉自動載入功能可以得到更好的性能。

一、在一個大型的j2ee項目中進行大量壓力測試下,在開發模式下莫名其妙的發生錯誤,部分請求任務失敗,就是因為載入類造成的系統沖突。

二、在另外一個大型的j2ee項目實際應用過程中,突發的大量用戶讓足以滿足用戶的系統處于癱瘓邊緣,經過了系統、數據庫、應用服務器等等調整后,終沒有解決問題。最后不得不排除人員去現場解決,最后發現問題竟是這個原因。這個事件僅僅發生在前天。

調整方法3:控制httpsession

許多應用服務需要一系列的客戶請求,這些請求之間又相互依存。因為http協議是無狀態的,所以基于web的應用系統必須使用session技術來維持連接。為了實現應用服務進行狀態管理,java servlet技術提供了一套api,通過使用httpsession對象進行會話管理,但是在使用這個功能的同時,不管servlet進行任何請求,httpsession對象都要進行讀寫,服務器也承擔了響應的系統開銷。你可以使用下列方法提升性能。

在默認情況下,不要在jsp頁面中創建httpsessions對象,jsp頁面默認會自動創建httpsessions,如果在你的jsp頁面中不需要httpsessions,為了節省一些性能,使用下面的頁面指令避免自動創建httpsessions對象。

<;%@ page session="false"%>

不要存儲大型對象到httpsession:如果你存儲大型對象數據到httpsession中,應用服務器不得不在每一次請求中處理整個的httpsession,這將會強迫使用java的串行化操作,占用大量系統資源。應用服務的性能將會因為java的串行化操作而減少。

在結束時候釋放httpsessions對象:在它們不在需要的時候使用httpsession.invalidate()方法消除sessions.

設置session的超時值:servlet有一個默認的超時值。如果你在這個時間里面,你既沒有移除它,也沒有使用它(進行任何服務請求),servlet服務將會自動將其銷毀。因為對內存和垃圾的回收處理,因此,超時值越大,對服務器的性能影響越大。所以,盡可能的保持session的超時值最小。

調整方法4:使用gzip壓縮

壓縮是一個去處庸余信息的操作,以便可以使用最小的空間存儲。使用gzip(gnu zip)壓縮內容可以顯著的減少下載html文件的時間。信息內容越小,傳送的速度越快。因此,如果在生成web應用的時候壓縮內容,就可以更快的傳送、顯示在用戶的屏幕上面。由于不是每一個瀏覽器都支持gzip壓縮功能,所以你必須簡單的檢查瀏覽器是否支持。

下面代碼是演示如何發送壓縮內容的例子:

public void doget(httpservletrequest request, httpservletresponse response)

throws ioexception, servletexception

{

outputstream out = null

// check the accepting-encoding header from the http request.

// if the header includes gzip, choose gzip.

// if the header includes compress, choose zip.

// otherwise choose no compression.

string encoding = request.getheader("accept-encoding");

if (encoding != null && encoding.indexof("gzip") != -1)

{

response.setheader("content-encoding" , "gzip");

out = new gzipoutputstream(response.getoutputstream());

}

else if (encoding != null && encoding.indexof("compress") != -1)

{

response.setheader("content-encoding" , "compress");

out = new zipoutputstream(response.getoutputstream());

}

else

{

out = response.getoutputstream();

}

……

……

}

調整方法5:不要使用singlethreadmodel

singlethreadmodel接口確保servlet在同一時間只接受一個請求。如果servlet實現這個接口,servlet將會為每一個新的請求創建隔離的servelet實例,這將造成很大的系統開銷。如果你需要處理線程安全問題,可以使用其他方法代替這種方法。在servlet2.4中singlethreadmodel接口已經被反對使用。

調整方法6:使用線程池

servlet引擎為每一個請求創建一個隔離的線程,分配這個線程給service()方法,在它執行完后移除這個線程。默認情況下,servlet引擎為每一個請求創建新的線程。因為創建和消除線程是需要系統開銷的,這種行為將會引起性能問題??梢酝ㄟ^使用線程池來提升性能。依據所期望的并發用戶數量,配置線程池的最大、最小、以及增加數量。在服務啟動的時候,servlet引擎使用最小的線程數量創建一個線程池。然后servlet引擎會分配線程給每一個請求,替換原來的創建新的線程,在處理完成后把線程返回給線程池。使用線程池,性能會有一個顯著的提升。如果需要,根據線程的最大和增加數量,更多的線程會被創建,添加到池中以供更多的請求使用。

調整方法7:選擇正確的包含機制

在jsp中有兩種方法使用包含文件:包含指令(<;%@ include file="test.jsp" %>) 和包含動作 (<;jsp:include page="test.jsp" flush="true" />)。包含指令在轉換的過程中包含文件內容;也就是說,在一個頁面轉換成一個servlet的時候。包含動作在請求處理的階段包含文件內容;也就是說,在一個用戶請求頁面的時候。包含指令快于包含動作。因此,除非被包含的內容經常變化,應該使用包含指令提升性能。

調整方法8:選擇正確的范圍在使用usebean動作

jsp頁面的一個強大功能就是在jsp中交互使用javabeans組件。通過使用<;jsp:usebean>動作標簽,javabeans可以被直接的嵌入jsp頁面中。語法如下:

<;jsp:usebean id="name" scope="page|request|session|application" class=

"package.classname" type="typename">

<;/jsp:usebean>

范圍屬性指定了bean的作用范圍。它的默認值是page.你可以根據你的系統要求選擇正確的范圍。否則它會影響到應用系統的性能。

舉例說明,如果你需要一個對象僅僅作為請求使用,但是你的范圍設置為session,在你完成請求后,這個對象將依然會留在內存中。直到你明確的清楚它為止,通過銷毀session,或者session自動超時。假如你沒有選擇正確的范圍,它同樣也會影響性能因為過度的內存和垃圾收集。因此,需要正確的設置對象的范圍,同時當你使用完成之后,也應該立即去除它們。

其他方法:

避免字符串相加:使用 + 操作會產生很多臨時對象,因為string是不可變化(immutable)的對象。越多的 + 操作,越多的臨時對象會被創建,造成很大的系統開銷。使用stringbuffer替換 + 操作,當你需要字符串相加的時候。

避免使用system.out.println:system.out.println是同步處理的在disk i/o操作中,并且會嚴重的影響性能。因此最大可能的要避免使用system.out.println.盡管存在強大的調試工具,有時候為了跟蹤目的、錯誤處理、調試程序,還是使用system.out.println.你應該配置system.out.println僅僅在開發和調試情況下使用。使用一個靜態的final boolean變量,在生產模式下,配置成false,避免system.out.println的使用。

servletoutputstream比較printwriter:使用printwriter會占用一些系統開銷,因為它是為處理字符流的輸出輸出功能。因此printwriter應該使用在確保有字符集轉換的環境中。換句話說,在你知道servlet返回的僅僅是二進制數據時候,應該使用servletoutputstream,這樣你可以消除字符轉換開銷,當servlet容器不用處理字符集轉換的時候。

總結

本文的目的是通過一些實踐操作,使用性能調整技術,通過提升servlets和jsp頁面的性能,進而提升j2ee應用系統的性能。下一次將會涉及性能調整關于ejb (enterprise javabeans), jms (java message service), and jdbc (java database connectivity)。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金川县| 延庆县| 徐水县| 应城市| 盐城市| 黔东| 外汇| 扶余县| 高安市| 福贡县| 安仁县| 三原县| 怀安县| 岑巩县| 大渡口区| 无为县| 凌云县| 武宣县| 邹平县| 东辽县| 昔阳县| 璧山县| 门源| 汕尾市| 祁阳县| 永平县| 香港 | 河间市| 仪陇县| 绥江县| 孟村| 洪湖市| 康马县| 泰来县| 梁山县| 芮城县| 诸城市| 岳阳县| 加查县| 宿州市| 双流县|