一返回多個數據集
檢查你的訪問數據庫的代碼看是否存在著要返回多次的請求每次往返降低了你的應用程序的每秒能夠響應請求的次數通過在單個數據庫請求中返回多個結果集可以減少與數據庫通信的時間使你的系統具有擴展性也可以減少數據庫服務器響應請求的工作量
如果你是用動態的SQL語句來返回多個數據集那我建議你用存儲過程來替代動態的SQL語句是否把業務邏輯寫到存儲過程中這個有點爭議但是我認為把業務邏輯寫到存儲過程裡面可以限制返回結果集的大小減小網絡數據的流量在邏輯層也不用在過濾數據這是一個好事情
用SqlCommand對象的ExecuteReader方法返回一個強類型的業務對象再調用NextResult方法來移動數據集指針來定位數據集示例一演示了一個返回多個ArrayList強類型對象的例子只從數據庫中返回你需要的數據可以大大的減小你的服務器所耗用的內存
二對數據進行分頁
ASPNET的DataGrid有一個非常有用的功能分頁如果DataGrid允許分頁在某一時刻它只下載某一頁的數據另外它有一個數據分頁的濟覽導航欄它讓你可以選擇浏覽某一頁而且每次只下載一頁的數據
但是它有一個小小的缺點就是你必須把所有的數據都綁定到DataGrid中也就是說你的數據層必須返回所有的數據然後DataGrid再根據當前頁過濾出當前頁所需要的數據顯示出來如果有一個一萬條記錄的結果集要用DataGrid進行分頁假設DataGrid每頁只顯示條數據那就意味著每次請求都有條數據都是要丟棄的每次請求都要返回這麼大的數據集對應用程序的性能影響是非常大的
一個好的解決方案是寫一個分頁的存儲過程例子是一個用於對Northwind數據庫orders表的分頁存儲過程你只需要傳當前頁碼每頁顯示的條數兩個參數進來存儲過程會返回相應的結果
在服務器端我專門寫了一個分頁的控件來處理數據的分頁在這裡我用了第一個方法在一個存儲過程裡面返回了兩個結果集數據記錄總數和要求的結果集
返回的記錄總數取決於要執行查詢例如一個where條件可以限制返回的結果集的大小因為在分頁界面中必須要根據數據集記錄的大小來計算總的頁數所以必須要返回結果集的記錄數例如如果一共有條記錄如果用where條件就可以過濾成只返回條記錄存儲過程的分頁邏輯應該知道返回那些需要顯示的數據
三連接池
用TCP來連接你的應用程序與數據庫是一件昂貴的事情(很費時的事情)微軟的開發者可以通過用連接池來反復的使用數據庫的連接比起每次請求都用TCP來連一次數據庫連接池只有在不存在有效的連接時才新建一個TCP連接當關閉一個連接的時候它會被放到池中它仍然會保持與數據庫的連接這樣就可以減少與數據庫的TCP連接次數
當然你要注意那些忘記關的連接你應在每次用完連接後馬上關閉它我要強調的是無論什麼人說net framework中的GC(垃圾收集器)總會在你用完連接對象後調用連接對象的Close或者Dispose方法顯式的關閉你的連接不要期望CLR會在你想象的時間內關掉連接雖然CLR最終都要銷毀對象和關閉邊接但是我們並不能確定它到底會在什麼時候做這些事情
要用連接池優化有兩條規則第一打開連接處理數據然後關閉連接如果你必須在每次請求中多次打開或關閉連接這好過一直打開一個邊接然後把它傳到各個方法中第二用相同的連接字符串(或者用相同的用戶標識當你用集成認證的時候)如果你沒有用相同的連接字符串如你用基於登錄用戶的連接字符串這將不能利用連接池的優化功能如果你用的是集成的論證因為用戶很多所以你也不能充分利用連接池的優化功能NET CLR提供了一個數據性能計數器它在我們需要跟蹤程序性能特性的時候非常有用當然也包括連接池的跟蹤了
無論你的應用程序什麼時候要連在另一台機子的資源如數據庫你都應該重點優化你連資源所花的時間接收和發送數據的時間以及往返回之間的次數優化你的應用程序中的每一個處理點(process hop)它是提高你的應用的性能的出發點
應用程序層包含與數據層連接傳送數據到相應的類的實例以及業務處理的邏輯例如在Community Server中要組裝一個Forums或者Threads集合然後應用業務邏輯如授權更重要的這裡要完成緩存邏輯
[] [] []
From:http://tw.wingwit.com/Article/program/net/201311/15288.html