創建使用ADO DataSet連接問題
本文就詳細說明ADO DataSet文檔以及MSDN站點都推薦所有人運用using(sqlconnection cn=new sqlconnection()){}這樣地方式來創建Connection,因為當超過{}后,.net framwork會自動執行Connection.dispose()方法,所以可以確保Connetion被及時地關閉。
1)那么及時地調用.dispose()真地這么重要么,ADO DataSet如果一個對象超出了生存空間,在.net中不是會自動被GC(垃圾回收器)自動清理地么?
這個問題其實是由于GC導致地,.net中運用地GC,他對于工作并不像我們這樣勤奮。GC只有當外界環境非常惡劣地時候(沒有足夠地內容分配地時候)他才會動手打掃衛生(清理不運用地對象)。所以對于Connection 即使超出了變量地生命周期,它可能還沒有被GC干掉。
依舊未將Connection返回給Connection Pool。所以這就導致了下一個連接可能會有Connection Pool中沒有Available地Connection而從新打開一個新地連接,無端地浪費了多余地性能。所以ADO.net team反復強調要及時地關閉當前地連接。一個***地方法就是運用using{}block 系統會在退出{}地時候自動調用connection.dispose方法,而dispose會自動去執行close方法,釋放當前地connection。果您地項目是ASP.NET/WebService 我們會建議您運用Connection Pool因為這個功能可以幫助您減少由于頻繁創建連接帶來地巨大系統開銷。
如果您地系統是一個C/S模型結構,我們會不建議您運ADO DataSet用Connection Pool,這是由于一般而言,在C/S這樣地模型中,每一個用戶均為運用自己地用戶名密碼去連接后臺數據庫,運用地均為不同地Connection String,根本不會出現頻繁出現打開/關閉數據庫連接地問題。#t#
實際上在C/S模型中,您可以一直使一個Connection維護open地關閉,而不Close,這樣更可以提高您系統地性能,不會由于Connection Pool地額外檢查而帶來系統資源地消耗,相應情況下也不必擔心一直打開地Connection長時間地占用了連接,導致其他地連接無法從connecADO DataSettion pool 及時獲取到。(因為您根本就不需要運用到connection pool)。#t#
ADO.NET給了你從數據源返回什么數據的明顯控制,也提供了在數據集中存儲了多少數據的控制。在設計應用程序時可以考慮以下技巧:
避免使用DataAdapter.Fill,它使用了startRecord和maxRecords值。使用這種ADO DataSet方式填充數據集時,數據集只填充由maxRecords參數指定的記錄個數(從參數startRecord指定的記錄開始),而不管返回的整個查詢。這導致讀取過時的"不想要的"記錄,同時使用了不必要的服務器資源來返回補充記錄。
用于在某個時候只返回一頁記錄的技術之一是建立一個SQL語句,該語句包含一個WHERE和ORDER BY子句,并有TOP判定。這種技術依賴于識別每個唯一行的方法。當導航到下一頁的記錄時,修改WHERE子句使它包含所有唯一標識比當前v頁標識大的記錄;當導航到前面一頁時,修改WHERE子句使它包含所有唯一標識比當前頁標識小的記錄。對于兩種查詢都只返回記錄的TOP頁的記錄。當導航到前面一頁時需要對記錄進行降序排列,ADO DataSet這將返回查詢的末尾頁(如果需要可以在顯示前對記錄進行重新排序)。