服務熱線
153 8323 9821
一、數據庫操作
1、用完馬上關閉數據庫連接
訪問數據庫資源需要創建連接、打開連接和關閉連接幾個操作。這些過程需要多次與數據庫交換信息以通過身份驗證,比較耗費服務器資
源。ASP.NET中提供了連接池(Connection Pool)改善打開和關閉數據庫對性能的影響。系統將用戶的數據庫連接放在連接池中,需要時取出,關閉時收回連接,等待下一次的連接請求。
連接池的大小是有限的,如果在連接池達到最大限度后仍要求創建連接,必然大大影響性能。因此,在建立數據庫連接后只有在真正需要操作時才打開連接,使用完畢后馬上關閉,從而盡量減少數據庫連接打開的時間,避免出現超出連接限制的情況。
用(推薦)
using(SqlConnection Conn=new SqlConnection(connstr))
{}//不必顯示關閉
或
try{conn.Open();}
catch{}
finally{conn.Close();}
2、盡量使用存儲過程,并優化查詢語句
存儲過程是存儲在服務器上的一組預編譯的SQL語句,類似于DOS系統中的批處理文件。存儲過程具有對數據庫立即訪問的功能,信息處理極為迅速。使用存儲過程可以避免對命令的多次編譯,在執行一次后其執行規劃就駐留在高速緩存中,以后需要時只需直接調用緩存中的二進制代碼即可。在 .NET Framework 提供的所有數據訪問方法中,基于 SQL Server 的數據訪問是生成高性能、可縮放 Web 應用程序的推薦選擇。使用托管 SQL Server 提供程序時,可通過使用編譯的存儲過程而不是特殊查詢獲得額外的性能提高。
另外,存儲過程在服務器端運行,獨立于ASP.NET程序,便于修改,最重要的是它可以減少數據庫操作語句在網絡中的傳輸。
優化查詢語句
ASP.NET中ADO連接消耗的資源相當大,SQL語句運行的時間越長,占用系統資源的時間也越長。因此,盡量使用優化過的SQL語句以減少執行時間。比如,不在查詢語句中包含子查詢語句,盡量只返回有用的數據、字段,充分利用索引等。
3、只讀數據訪問用SqlDataReader,不要使用DataSet
SqlDataReader 類提供了一種讀取從 SQL Server 數據庫檢索的只進數據流的方法。如果當創建 ASP.NET 應用程序時出現允許您使用它的情況,則 SqlDataReader 類提供比 DataSet 類更高的性能。情況之所以這樣,是因為 SqlDataReader 使用 SQL Server 的本機網絡數據傳輸格式從數據庫連接直接讀取數據。另外,SqlDataReader 類實現 IEnumerable 接口,該接口也允許您將數據綁定到服務器控件。DataSet作為一個功能強大的、支持離線的數據庫,其對性能的開銷也相對較大。
Sqldataread優點:讀取數據非??臁H绻麑Ψ祷氐臄祿恍枳龃罅刻幚淼那闆r下,建議使用SqlDataReader,其性能要比datset好很多。缺點:直到數據讀完才可close掉于數據庫的連接。
Dataset是把數據讀出,緩存在內存中。缺點:對內存的占用較高。如果對返回的數據需做大量的處理用Dataset比較好些可以減少對數據庫的連接操作。優點:只需連接一次就可close于數據庫的連接。
一般情況下,讀取大量數據,對返回數據不做大量處理用SqlDataReader.對返回數據大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決于程序功能的實現。
4、數據的綁定DataBinder
一般的綁定方法<%# DataBinder.Eval(Container.DataItem, "字段名") %>
用DataBinder.eval 綁定不必關心數據來源(read或dataset)。不必關心數據的類型eval會把這個數據對象轉換為一個字符串。在底層綁定做了很多工作,使用了反射性能。正因為使用方便了,但卻影響了數據性能。
來看下<%# DataBinder.Eval(Container.DataItem, "字段名") %>。當于dataset綁定時,DataItem其實式一個DataRowView(如果綁定的是一個數據讀取器(dataread)它就是一個IdataRecord。)因此直接轉換成DataRowView的話,將會給性能帶來很大提升。
<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>
對數據的綁定建議使用<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>。使用時注意兩個方面:
1.需在頁面添加<%@ Import namespace="System.Data"%>.
2.注意字段名的大小寫(要特別注意)。如果和查詢的不一致,在某些情況下會導致比<%# DataBinder.Eval(Container.DataItem, "字段名") %>還要慢。如果想進一步提高速度,可采用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不過其可讀性不高。
以上的是vb.net的寫法。在c#中:<%# ((DataRowView)Container.DataItem)["字段名"] %>
5、返回多個結果集
無論SqlDataReader還是datset,返回多個結果集,然后用rd.NextResult()或ds.Tables來分別處理數據,減少重復連接數據庫的次數。同時盡量用比較高效的SQL代替后續復雜的DataSet二次加工。
二、頁面優化
1、不使用不必要的服務器控件(Server Control)
ASP.net中,大量的服務器端控件方便了程序開發,但也可能帶來性能的損失,因為用戶每操作一次服務器端控件,就產生一次與服務器端的往返過程。因此,非必要,應當少使用Server Control。還有許多其他情況,在這些情況中呈現或數據綁定比使用服務器控件更有效,甚至是在使用服務器控件模板時。但是,如果要以編程方式操作服務器控件的屬性、處理服務器控件事件或利用視圖狀態保存,則使用服務器控件是適當的。
所以,盡量選擇html控件。能在客戶端實現的功能就在客戶端實現(熟練掌握javascript),減少服務器的壓力。
2、不使用不必要的ViewState
默認情況下,ASP.Net對所有的Server Control都啟用了ViewState(視圖狀態)。但ViewState需要在客戶端保存一些信息,這會造成性能的消耗。當必須使用Server Control時,可以考慮禁止ViewState。
只在必要時保存服務器控件視圖狀態。自動視圖狀態管理是服務器控件的功能,該功能使服務器控件可以在往返過程上重新填充它們的屬性值(您不需要編寫任何代碼)。但是,因為服務器控件的視圖狀態在隱藏的窗體字段中往返于服務器,所以該功能確實會對性能產生影響。您應該知道在哪些情況下視圖狀態會有所幫助,在哪些情況下它影響頁的性能。例如,如果您將服務器控件綁定到每個往返過程上的數據,則將用從數據綁定操作獲得的新值替換保存的視圖狀態。在這種情況下,禁用視圖狀態可以節省處理時間。
默認情況下,為所有服務器控件啟用視圖狀態。若要禁用視圖狀態,請將控件的 EnableViewState 屬性設置為 false,如下面的 DataGrid 服務器控件示例所示。
<aspatagrid EnableViewState="false" runat="server"/>
您還可以使用 @ Page 指令禁用整個頁的視圖狀態。當您不從頁回發到服務器時,這將十分有用: <%@ Page EnableViewState="false" %>
注意 @ Control 指令中也支持 EnableViewState 屬性,該指令允許您控制是否為用戶控件啟用視圖狀態。
若要分析頁上服務器控件使用的視圖狀態的數量,請(通過將 trace="true" 屬性包括在 @ Page 指令中)啟用該頁的跟蹤并查看 Control Hierarchy 表的 Viewstate 列。
3、避免到服務器的不必要的往返過程
雖然您很可能希望盡量多地使用 Web 窗體頁框架的那些節省時間和代碼的功能,但在某些情況下卻不宜使用 ASP.NET 服務器控件和回發事件處理。
通常,只有在檢索或存儲數據時,您才需要啟動到服務器的往返過程。多數數據操作可在這些往返過程間的客戶端上進行。例如,從 HTML 窗體驗證用戶輸入經??稍跀祿峤坏椒掌髦霸诳蛻舳诉M行。通常,如果不需要將信息傳遞到服務器以將其存儲在數據庫中,那么您不應該編寫導致往返過程的代碼。
如果您開發自定義服務器控件,請考慮讓它們為支持 ECMAScript 的瀏覽器呈現客戶端代碼。通過以這種方式使用服務器控件,您可以顯著地減少信息被不必要的發送到 Web 服務器的次數。
使用 Page.IsPostBack 避免對往返過程執行不必要的處理
如果您編寫處理服務器控件回發處理的代碼,有時可能需要在首次請求頁時執行其他代碼,而不是當用戶發送包含在該頁中的 HTML 窗體時執行的代碼。根據該頁是否是響應服務器控件事件生成的,使用 Page.IsPostBack 屬性有條件地執行代碼。例如,下面的代碼演示如何創建數據庫連接和命令,該命令在首次請求該頁時將數據綁定到 DataGrid 服務器控件。
void Page_Load(Object sender, EventArgs e)
{
if(!Page.IsPostBack)
{}
}
由于每次請求時都執行 Page_Load 事件,上述代碼檢查 IsPostBack 屬性是否設置為 false。如果是,則執行代碼。如果該屬性設置為true,則不執行代碼。
注意 如果不運行這種檢查,回發頁的行為將不更改。Page_Load 事件的代碼在執行服務器控件事件之前執行,但只有服務器控件事件的結果才可能在輸出頁上呈現。如果不運行該檢查,仍將為 Page_Load 事件和該頁上的任何服務器控件事件執行處理。
4、當不使用會話狀態時禁用它,并且程序開發中盡量少用Session
并不是所有的應用程序或頁都需要針對于具體用戶的會話狀態,您應該對任何不需要會話狀態的應用程序或頁禁用會話狀態。
若要禁用頁的會話狀態,請將 @ Page 指令中的 EnableSessionState 屬性設置為 false。例如: <%@ Page EnableSessi %>
注意 如果頁需要訪問會話變量,但不打算創建或修改它