同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁 優(yōu)化推廣 Asp.net程序性能優(yōu)化(一)

Asp.net程序性能優(yōu)化(一)

來源: | 時(shí)間:2013/8/28 14:42:03 |

一、數(shù)據(jù)庫操作
1、用完馬上關(guān)閉數(shù)據(jù)庫連接
  訪問數(shù)據(jù)庫資源需要?jiǎng)?chuàng)建連接、打開連接和關(guān)閉連接幾個(gè)操作。這些過程需要多次與數(shù)據(jù)庫交換信息以通過身份驗(yàn)證,比較耗費(fèi)服務(wù)器資
源。ASP.NET中提供了連接池(Connection Pool)改善打開和關(guān)閉數(shù)據(jù)庫對性能的影響。系統(tǒng)將用戶的數(shù)據(jù)庫連接放在連接池中,需要時(shí)取出,關(guān)閉時(shí)收回連接,等待下一次的連接請求。

   連接池的大小是有限的,如果在連接池達(dá)到最大限度后仍要求創(chuàng)建連接,必然大大影響性能。因此,在建立數(shù)據(jù)庫連接后只有在真正需要操作時(shí)才打開連接,使用完畢后馬上關(guān)閉,從而盡量減少數(shù)據(jù)庫連接打開的時(shí)間,避免出現(xiàn)超出連接限制的情況。
用(推薦)
using(SqlConnection Conn=new SqlConnection(connstr))
{}//不必顯示關(guān)閉

try{conn.Open();}
catch{}
finally{conn.Close();}

2、盡量使用存儲過程,并優(yōu)化查詢語句
  存儲過程是存儲在服務(wù)器上的一組預(yù)編譯的SQL語句,類似于DOS系統(tǒng)中的批處理文件。存儲過程具有對數(shù)據(jù)庫立即訪問的功能,信息處理極為迅速。使用存儲過程可以避免對命令的多次編譯,在執(zhí)行一次后其執(zhí)行規(guī)劃就駐留在高速緩存中,以后需要時(shí)只需直接調(diào)用緩存中的二進(jìn)制代碼即可。在 .NET Framework 提供的所有數(shù)據(jù)訪問方法中,基于 SQL Server 的數(shù)據(jù)訪問是生成高性能、可縮放 Web 應(yīng)用程序的推薦選擇。使用托管 SQL Server 提供程序時(shí),可通過使用編譯的存儲過程而不是特殊查詢獲得額外的性能提高。
  另外,存儲過程在服務(wù)器端運(yùn)行,獨(dú)立于ASP.NET程序,便于修改,最重要的是它可以減少數(shù)據(jù)庫操作語句在網(wǎng)絡(luò)中的傳輸。
  優(yōu)化查詢語句
  ASP.NET中ADO連接消耗的資源相當(dāng)大,SQL語句運(yùn)行的時(shí)間越長,占用系統(tǒng)資源的時(shí)間也越長。因此,盡量使用優(yōu)化過的SQL語句以減少執(zhí)行時(shí)間。比如,不在查詢語句中包含子查詢語句,盡量只返回有用的數(shù)據(jù)、字段,充分利用索引等。

3、只讀數(shù)據(jù)訪問用SqlDataReader,不要使用DataSet
  SqlDataReader 類提供了一種讀取從 SQL Server 數(shù)據(jù)庫檢索的只進(jìn)數(shù)據(jù)流的方法。如果當(dāng)創(chuàng)建 ASP.NET 應(yīng)用程序時(shí)出現(xiàn)允許您使用它的情況,則 SqlDataReader 類提供比 DataSet 類更高的性能。情況之所以這樣,是因?yàn)?SqlDataReader 使用 SQL Server 的本機(jī)網(wǎng)絡(luò)數(shù)據(jù)傳輸格式從數(shù)據(jù)庫連接直接讀取數(shù)據(jù)。另外,SqlDataReader 類實(shí)現(xiàn) IEnumerable 接口,該接口也允許您將數(shù)據(jù)綁定到服務(wù)器控件。DataSet作為一個(gè)功能強(qiáng)大的、支持離線的數(shù)據(jù)庫,其對性能的開銷也相對較大。
Sqldataread優(yōu)點(diǎn):讀取數(shù)據(jù)非???。如果對返回的數(shù)據(jù)不需做大量處理的情況下,建議使用SqlDataReader,其性能要比datset好很多。缺點(diǎn):直到數(shù)據(jù)讀完才可close掉于數(shù)據(jù)庫的連接。

Dataset是把數(shù)據(jù)讀出,緩存在內(nèi)存中。缺點(diǎn):對內(nèi)存的占用較高。如果對返回的數(shù)據(jù)需做大量的處理用Dataset比較好些可以減少對數(shù)據(jù)庫的連接操作。優(yōu)點(diǎn):只需連接一次就可close于數(shù)據(jù)庫的連接。
一般情況下,讀取大量數(shù)據(jù),對返回?cái)?shù)據(jù)不做大量處理用SqlDataReader.對返回?cái)?shù)據(jù)大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決于程序功能的實(shí)現(xiàn)。

4、數(shù)據(jù)的綁定DataBinder
一般的綁定方法<%# DataBinder.Eval(Container.DataItem, "字段名") %>
用DataBinder.eval 綁定不必關(guān)心數(shù)據(jù)來源(read或dataset)。不必關(guān)心數(shù)據(jù)的類型eval會把這個(gè)數(shù)據(jù)對象轉(zhuǎn)換為一個(gè)字符串。在底層綁定做了很多工作,使用了反射性能。正因?yàn)槭褂梅奖懔?,但卻影響了數(shù)據(jù)性能。
來看下<%# DataBinder.Eval(Container.DataItem, "字段名") %>。當(dāng)于dataset綁定時(shí),DataItem其實(shí)式一個(gè)DataRowView(如果綁定的是一個(gè)數(shù)據(jù)讀取器(dataread)它就是一個(gè)IdataRecord。)因此直接轉(zhuǎn)換成DataRowView的話,將會給性能帶來很大提升。
<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>
對數(shù)據(jù)的綁定建議使用<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>。使用時(shí)注意兩個(gè)方面:
1.需在頁面添加<%@ Import namespace="System.Data"%>.
2.注意字段名的大小寫(要特別注意)。如果和查詢的不一致,在某些情況下會導(dǎo)致比<%# DataBinder.Eval(Container.DataItem, "字段名") %>還要慢。如果想進(jìn)一步提高速度,可采用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不過其可讀性不高。
以上的是vb.net的寫法。在c#中:<%# ((DataRowView)Container.DataItem)["字段名"] %>
5、返回多個(gè)結(jié)果集
無論SqlDataReader還是datset,返回多個(gè)結(jié)果集,然后用rd.NextResult()或ds.Tables來分別處理數(shù)據(jù),減少重復(fù)連接數(shù)據(jù)庫的次數(shù)。同時(shí)盡量用比較高效的SQL代替后續(xù)復(fù)雜的DataSet二次加工。
二、頁面優(yōu)化

1、不使用不必要的服務(wù)器控件(Server Control)
ASP.net中,大量的服務(wù)器端控件方便了程序開發(fā),但也可能帶來性能的損失,因?yàn)橛脩裘坎僮饕淮畏?wù)器端控件,就產(chǎn)生一次與服務(wù)器端的往返過程。因此,非必要,應(yīng)當(dāng)少使用Server Control。還有許多其他情況,在這些情況中呈現(xiàn)或數(shù)據(jù)綁定比使用服務(wù)器控件更有效,甚至是在使用服務(wù)器控件模板時(shí)。但是,如果要以編程方式操作服務(wù)器控件的屬性、處理服務(wù)器控件事件或利用視圖狀態(tài)保存,則使用服務(wù)器控件是適當(dāng)?shù)摹?br /> 所以,盡量選擇html控件。能在客戶端實(shí)現(xiàn)的功能就在客戶端實(shí)現(xiàn)(熟練掌握javascript),減少服務(wù)器的壓力。

2、不使用不必要的ViewState
默認(rèn)情況下,ASP.Net對所有的Server Control都啟用了ViewState(視圖狀態(tài))。但ViewState需要在客戶端保存一些信息,這會造成性能的消耗。當(dāng)必須使用Server Control時(shí),可以考慮禁止ViewState。
只在必要時(shí)保存服務(wù)器控件視圖狀態(tài)。自動視圖狀態(tài)管理是服務(wù)器控件的功能,該功能使服務(wù)器控件可以在往返過程上重新填充它們的屬性值(您不需要編寫任何代碼)。但是,因?yàn)榉?wù)器控件的視圖狀態(tài)在隱藏的窗體字段中往返于服務(wù)器,所以該功能確實(shí)會對性能產(chǎn)生影響。您應(yīng)該知道在哪些情況下視圖狀態(tài)會有所幫助,在哪些情況下它影響頁的性能。例如,如果您將服務(wù)器控件綁定到每個(gè)往返過程上的數(shù)據(jù),則將用從數(shù)據(jù)綁定操作獲得的新值替換保存的視圖狀態(tài)。在這種情況下,禁用視圖狀態(tài)可以節(jié)省處理時(shí)間。
默認(rèn)情況下,為所有服務(wù)器控件啟用視圖狀態(tài)。若要禁用視圖狀態(tài),請將控件的 EnableViewState 屬性設(shè)置為 false,如下面的 DataGrid 服務(wù)器控件示例所示。
<aspatagrid EnableViewState="false" runat="server"/>
您還可以使用 @ Page 指令禁用整個(gè)頁的視圖狀態(tài)。當(dāng)您不從頁回發(fā)到服務(wù)器時(shí),這將十分有用: <%@ Page EnableViewState="false" %>
注意 @ Control 指令中也支持 EnableViewState 屬性,該指令允許您控制是否為用戶控件啟用視圖狀態(tài)。
若要分析頁上服務(wù)器控件使用的視圖狀態(tài)的數(shù)量,請(通過將 trace="true" 屬性包括在 @ Page 指令中)啟用該頁的跟蹤并查看 Control Hierarchy 表的 Viewstate 列。
3、避免到服務(wù)器的不必要的往返過程
  雖然您很可能希望盡量多地使用 Web 窗體頁框架的那些節(jié)省時(shí)間和代碼的功能,但在某些情況下卻不宜使用 ASP.NET 服務(wù)器控件和回發(fā)事件處理。
  通常,只有在檢索或存儲數(shù)據(jù)時(shí),您才需要啟動到服務(wù)器的往返過程。多數(shù)數(shù)據(jù)操作可在這些往返過程間的客戶端上進(jìn)行。例如,從 HTML 窗體驗(yàn)證用戶輸入經(jīng)??稍跀?shù)據(jù)提交到服務(wù)器之前在客戶端進(jìn)行。通常,如果不需要將信息傳遞到服務(wù)器以將其存儲在數(shù)據(jù)庫中,那么您不應(yīng)該編寫導(dǎo)致往返過程的代碼。
  如果您開發(fā)自定義服務(wù)器控件,請考慮讓它們?yōu)橹С?ECMAScript 的瀏覽器呈現(xiàn)客戶端代碼。通過以這種方式使用服務(wù)器控件,您可以顯著地減少信息被不必要的發(fā)送到 Web 服務(wù)器的次數(shù)。
  使用 Page.IsPostBack 避免對往返過程執(zhí)行不必要的處理
  如果您編寫處理服務(wù)器控件回發(fā)處理的代碼,有時(shí)可能需要在首次請求頁時(shí)執(zhí)行其他代碼,而不是當(dāng)用戶發(fā)送包含在該頁中的 HTML 窗體時(shí)執(zhí)行的代碼。根據(jù)該頁是否是響應(yīng)服務(wù)器控件事件生成的,使用 Page.IsPostBack 屬性有條件地執(zhí)行代碼。例如,下面的代碼演示如何創(chuàng)建數(shù)據(jù)庫連接和命令,該命令在首次請求該頁時(shí)將數(shù)據(jù)綁定到 DataGrid 服務(wù)器控件。
void Page_Load(Object sender, EventArgs e)
{
if(!Page.IsPostBack)
{}
}
  由于每次請求時(shí)都執(zhí)行 Page_Load 事件,上述代碼檢查 IsPostBack 屬性是否設(shè)置為 false。如果是,則執(zhí)行代碼。如果該屬性設(shè)置為true,則不執(zhí)行代碼。
  注意 如果不運(yùn)行這種檢查,回發(fā)頁的行為將不更改。Page_Load 事件的代碼在執(zhí)行服務(wù)器控件事件之前執(zhí)行,但只有服務(wù)器控件事件的結(jié)果才可能在輸出頁上呈現(xiàn)。如果不運(yùn)行該檢查,仍將為 Page_Load 事件和該頁上的任何服務(wù)器控件事件執(zhí)行處理。

4、當(dāng)不使用會話狀態(tài)時(shí)禁用它,并且程序開發(fā)中盡量少用Session
  并不是所有的應(yīng)用程序或頁都需要針對于具體用戶的會話狀態(tài),您應(yīng)該對任何不需要會話狀態(tài)的應(yīng)用程序或頁禁用會話狀態(tài)。
  若要禁用頁的會話狀態(tài),請將 @ Page 指令中的 EnableSessionState 屬性設(shè)置為 false。例如: <%@ Page EnableSessi %>
  注意 如果頁需要訪問會話變量,但不打算創(chuàng)建或修改它

服務(wù)熱線

153 8323 9821

功能和特性

價(jià)格和優(yōu)惠

網(wǎng)站和維護(hù)

推廣和優(yōu)化

微信服務(wù)號