ASP.NET程式的最佳化建議)一、資料庫操作

來源:互聯網
上載者:User

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優點:讀取資料非常快。如果對返回的資料不需做大量處理的情況下,建議使用SqlDataReader,其效能要比datset好很多。缺點:直到資料讀完才可close掉於資料庫的串連。

Dataset是把資料讀出,緩衝在記憶體中。缺點:對記憶體的佔用較高。如果對返回的資料需做大量的處理用Dataset比較好些可以減少對資料庫的串連操作。優點:只需串連一次就可close於資料庫的串連。

一般情況下,讀取大量資料,對返回資料不做大量處理用SqlDataReader.對返回資料大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決於程式功能的實現。

4、資料的綁定DataBinder

一般的Binder 方法<%# 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[i]來分別處理資料,減少重複串連資料庫的次數。同時盡量用比較高效的SQL代替後續複雜的DataSet二次加工。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.