熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

提高ASP.NET應用程序性能的10大方法[1]

2013-11-13 12:16:31  來源: .NET編程 

  返回多個數據集

  檢查你的訪問數據庫的代碼看是否存在著要返回多次的請求每次往返降低了你的應用程序的每秒能夠響應請求的次數通過在單個數據庫請求中返回多個結果集可以減少與數據庫通信的時間使你的系統具有擴展性也可以減少數據庫服務器響應請求的工作量

  如果你是用動態的SQL語句來返回多個數據集那我建議你用存儲過程來替代動態的SQL語句是否把業務邏輯寫到存儲過程中這個有點爭議但是我認為把業務邏輯寫到存儲過程裡面可以限制返回結果集的大小減小網絡數據的流量在邏輯層也不用在過濾數據這是一個好事情

  用SqlCommand對象的ExecuteReader方法返回一個強類型的業務對象再調用NextResult方法來移動數據集指針來定位數據集示例一演示了一個返回多個ArrayList強類型對象的例子只從數據庫中返回你需要的數據可以大大的減小你的服務器所耗用的內存

// read the first resultset
reader = commandExecuteReader();

// read the data from that resultset
while (readerRead()) {
    suppliersAdd(PopulateSupplierFromIDataReader( reader ));
}

// read the next resultset
readerNextResult();

// read the data from that second resultset
while (readerRead()) {
    productsAdd(PopulateProductFromIDataReader( reader ));
}

  對數據進行分頁

  ASPNET的DataGrid有一個非常有用的功能分頁如果DataGrid允許分頁在某一時刻它只下載某一頁的數據另外它有一個數據分頁的濟覽導航欄它讓你可以選擇浏覽某一頁而且每次只下載一頁的數據

  但是它有一個小小的缺點就是你必須把所有的數據都綁定到DataGrid中也就是說你的數據層必須返回所有的數據然後DataGrid再根據當前頁過濾出當前頁所需要的數據顯示出來如果有一個一萬條記錄的結果集要用DataGrid進行分頁假設DataGrid每頁只顯示條數據那就意味著每次請求都有條數據都是要丟棄的每次請求都要返回這麼大的數據集對應用程序的性能影響是非常大的

  一個好的解決方案是寫一個分頁的存儲過程例子是一個用於對Northwind數據庫orders表的分頁存儲過程你只需要傳當前頁碼每頁顯示的條數兩個參數進來存儲過程會返回相應的結果

  在服務器端我專門寫了一個分頁的控件來處理數據的分頁在這裡我用了第一個方法在一個存儲過程裡面返回了兩個結果集數據記錄總數和要求的結果集

  返回的記錄總數取決於要執行查詢例如一個where條件可以限制返回的結果集的大小因為在分頁界面中必須要根據數據集記錄的大小來計算總的頁數所以必須要返回結果集的記錄數例如如果一共有條記錄如果用where條件就可以過濾成只返回條記錄存儲過程的分頁邏輯應該知道返回那些需要顯示的數據

Paging Through the Orders Table
CREATE PROCEDURE northwind_OrdersPaged
(
    @PageIndex int
    @PageSize int
)
AS
BEGIN
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int

First set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + )
SET ROWCOUNT @RowsToReturn

Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize +

Create a temp table to store the select results
CREATE TABLE #PageIndex
(
    IndexId int IDENTITY ( ) NOT NULL
    OrderID int
)

Insert into the temp table
INSERT INTO #PageIndex (OrderID)
SELECT
    OrderID
FROM
    Orders
ORDER BY
    OrderID DESC

Return total count
SELECT COUNT(OrderID) FROM Orders

Return paged results
SELECT
    O*
FROM
    Orders O
    #PageIndex PageIndex
WHERE
    OOrderID = PageIndexOrderID AND
    PageIndexIndexID > @PageLowerBound AND
    PageIndexIndexID < @PageUpperBound
ORDER BY
    PageIndexIndexID

END

[]  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15553.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.