===============================
技巧 1 — 返回多個結果集
仔細查看您的數據庫代碼,看是否存在多次進入數據庫的請求路徑。每個這樣的往返都會降低應用程序可以提供的每秒請求數量。通過在一個數據庫請求中返回多個結果集,可以節省與數據庫進行通信所需的總時間長度。同時因為減少了數據庫服務器管理請求的工作,還會使得系統伸縮性更強。
雖然可以使用動態SQL返回多個結果集,但是我首選使用存儲過程。關于業務邏輯是否應該駐留于存儲過程的問題還存在一些爭議,但是我認為,如果存儲過程中的邏輯可以約束返回數據的話(縮小數據集的大小、縮短網絡上所花費時間,不必篩選邏輯層的數據),則應贊成這樣做。
使用 SqlCommand 實例及其 ExecuteReader 方法填充強類型的業務類時,可以通過調用 NextResult 將結果集指針向前移動。圖 1 顯示了使用類型類填充幾個 ArrayList 的示例會話。只從數據庫返回您需要的數據將進一步減少服務器上的內存分配。
==================================
技巧 2 — 分頁的數據訪問
ASP.NET DataGrid 具有一個很好的功能:數據分頁支持。在 DataGrid 中啟用分頁時,一次會顯示固定數量的記錄。另外,在 DataGrid 的底部還會顯示分頁 UI,以便在記錄之間進行導航。該分頁 UI 使您能夠在所顯示的數據之間向前和向后導航,并且一次顯示固定數量的記錄。
還有一個小小的波折。使用 DataGrid 的分頁需要所有數據均與網格進行綁定。例如,您的數據層需要返回所有數據,那么 DataGrid 就會基于當前頁篩選顯示的所有記錄。如果通過 DataGrid 進行分頁時返回了 100,000 個記錄,那么針對每個請求會放棄 99,975 個記錄(假設每頁大小為 25 個記錄)。當記錄的數量不斷增加時,應用程序的性能就會受到影響,因為針對每個請求必須發送越來越多的數據。
要編寫性能更好的分頁代碼,一個極佳的方式是使用存儲過程。圖 2 顯示了針對 Northwind 數據庫中的 Orders 表進行分頁的一個示例存儲過程。簡而言之,您此時要做的只是傳遞頁索引和頁大小。然后就會計算合適的結果集,并將其返回。
在社區服務器中,我們編寫了一個分頁服務器控件,以完成所有的數據分頁。您將會看到,我使用的就是技巧 1 中討論的理念,從一個存儲過程返回兩個結果集:記錄的總數和請求的數據。
返回記錄的總數可能會根據所執行查詢的不同而有所變化。例如,WHERE 子句可用來約束返回的數據。為了計算在分頁 UI 中顯示的總頁數,必須了解要返回記錄的總數。例如,如果總共有 1,000,000 條記錄,并且要使用一個 WHERE 子句將其篩選為 1000 條記錄,那么分頁邏輯就需要了解記錄的總數才能正確呈現分頁 UI。
==============================
技巧 3 — 連接池
在 Web 應用程序和 SQL Server™ 之間設置 TCP 連接可能是一個非常消耗資源的操作。Microsoft 的開發人員到目前為止能夠使用連接池已經有一段時間了,這使得他們能夠重用數據庫連接。他們不是針對每個請求都設置一個新的 TCP 連接,而是只在連接池中沒有任何連接時才設置新連接。當連接關閉時,它會返回連接池,在其中它會保持與數據庫的連接,而不是完全破壞該 TCP 連接。
當然,您需要小心是否會出現泄漏連接。當您完成使用連接時,請一定要關閉這些連接。再重復一遍:無論任何人對 Microsoft?.NET Framework 中的垃圾回收有什么評論,請一定要在完成使用連接時針對該連接顯式調用 Close 或 Dispose。不要相信公共語言運行庫 (CLR) 會在預先確定的時間為您清除和關閉連接。盡管 CLR 最終會破壞該類,并強制連接關閉,但是當針對對象的垃圾回收真正發生時,并不能保證。
要以最優化的方式使用連接池,需要遵守一些規則。首先打開連接,執行操作,然后關閉該連接。如果您必須如此的話,可以針對每個請求多次打開和關閉連接(最好應用技巧 1),但是不要一直將連接保持打開狀態并使用各種不同的方法對其進行進出傳遞。第二,使用相同的連接字符串(如果使用集成身份驗證的話,還要使用相同的線程標識)。如果不使用相同的連接字符串,例如根據登錄的用戶自定義連接字符串,那么您將無法得到連接池提供的同一個優化值。如果您使用集成身份驗證,同時還要模擬大量用戶,連接池的效率也會大大下降。嘗試跟蹤與連接池相關的任何性能問題時,.NET CLR 數據性能計數器可能非常有用。
文章來源于領測軟件測試網 http://www.k11sc111.com/