談談Asp.net網站最佳化一:SqlDataReader和DataSet的選擇

來源:互聯網
上載者:User

本文 發布之後,我發現有N多個 喜歡人云亦云的朋友,別人說 資料庫連接比 記憶體貴,你也說個 資料庫連接比記憶體貴,難道記憶體便宜就能成為我們不最佳化代碼的借口嗎?

     

 

  幾乎在每次面試的時候都會被問道這個問題。使用.NET開發當中讀取資料應該採用SqlDataReader 還是 DataSet以及對這兩者的理解。

       先來談談我本人對這兩者的理解:

       1、SqlDataReader:提供一種從 SQL Server 資料庫讀取行的只進流的方式。無法繼承此類。白話解釋就是 使用這個對象可以從資料庫中讀取唯讀類的資料。所謂唯讀,可以理解為一頭走到死,不撞南牆不回頭。就好比割麥機收麥子一樣,這一茬過去了後邊就沒有了。(千萬不要理解為資料庫中的資料是唯讀)

            那麼在什麼情況下我們才會用到SqlDataReader這個對象呢?

            首先、從資料庫中讀取一個實體物件的時候我們可以用到SqlDataReader

            其次、讀取一系列(列表)資料的時候可以用到SqlDataReader.

      需要注意的是。在使用SqlDataReader讀取完資料之後要對其進行顯式Close.否則他和資料庫就一直串連著,佔用記憶體不說,還容易出現問題。

      如果使用完成之後顯示將其銷毀,這個時候他已經不在佔用記憶體等等耗費資源的東西了!

       2、DataSet:MSDN(DataSet是ADO.NET的中心概念。可以把DataSet當成記憶體中的資料庫,DataSet是不依賴於資料庫的獨立資料集合。所謂獨立,就是說,即使斷開資料鏈路,或者關閉資料庫,DataSet依然是可用的,DataSet在內部是用XML來描述資料的,由於XML是一種與平台無關、與語言無關的資料描述語言 (Data Description Language),而且可以描述複雜關係的資料,比如父子關係的資料,所以DataSet實際上可以容納具有複雜關係的資料,而且不再依賴於資料庫鏈路。)

           白話解釋:DataSet 是一個資料集合,是存放在記憶體中的。相當於一個存放在記憶體中的資料庫(資料集合)並且不依賴於資料庫。

           相比SqlDataReader,DataSet的好處就是在於資料庫中斷連線之後。DataSet仍然儲存在記憶體中,可以隨意對其進行操作,比如,刪除row,合并,追加,修改某個資料等等。

           需要注意的是,由於DataSet是讀取後可以立刻關閉和資料庫的串連,這個時候DataSet就會存在記憶體中的。所以在等待GC自動回收之前,他一直佔用系統資源。對於我們讀取列表來說,把這樣一堆資料存在伺服器記憶體中顯然不是明智的選擇。

           伺服器記憶體是有限的。程式中如果存在大量沒有被GC回收的 DataSet ,後果……….

 

 

    開發中對於SqlDataReader和DataSet的選擇以及取捨

     如前文所述,幾乎每次面試的時候都會被問道這個問題。我相信very very much 的童鞋對這兩者的區別已經相當的了如指掌,甚至達到爐火純青的地步。

     但是,我看到過大多數的程式。包括我如今新的新公司現有的項目,我幾乎找不到SqlDataReader的影子。為什麼呢?

     在這裡我有個疑問,也就是為什麼大家會選擇DataSet而不是SqlDataReader來讀取資料? 很顯然,如果答案是DataSet更方便那是非常扯淡的!

      我在想,是否所有喜歡DataSet的童鞋們對DataSet和SqlDataReader的理解還不夠深入?我想不是的。或許是大家對概念性的東西不入尊耳,又或者是企業為了追尋開發效率,又或者大家以為在程式中對一個用DataSet讀取出來的列表進行修改刪除就是所謂的“可以隨意對其進行操作”。

      我需要糾正的一點是:此“隨意操作”非彼“隨意操作”,關於DataSet可以脫離資料庫而在記憶體中隨意操作的理解我認為是這樣的:“可以對DataSet資料集合中的資料進行一系列的操作。比如合并資料,統計資料,修改資料,刪除資料等等(當然這裡舉例可以不太確切)然後返回一個修改後的DataSet”。而事實上我見到的情況是 :僅僅在頁面(畫面)顯示資料列表,每行資料後邊再帶個修改,刪除等等這種情況仍然是使用DataSet.

     關於以上問題。完全可以用SqlDataReader 來替代,因為根本不存在什麼在記憶體中對列表進行操作的情況。為什麼不用SqlDataReader 呢?我自認為 DataSet 相比 SqlDataReader 的優點也就只有這麼一點點(或許我理解還不夠,或許還有別的),但是在上述情景中他這麼點有點已經蕩然無存,毫無用武之地,為什麼還要把他存在記憶體中來耗費那麼一點點系統資源的?

 

    SqlDataReader 相比 DataSet 的優點我相信各位看客都在心裡非常非常的清楚。但是實際上很少有人去使用SqlDataReader而偏向喜歡DataSet,我不知道為什麼。

或許很大一部分人都還處在剛畢業的水平吧!有或者是別的什麼原因。

 

    當我看到公司現有項目中

     a、)   沒有一個SqlDataReader .全部都是 使用DataSet來做SqlDataReader 的事情

     b、)   存在大量可以避免的頁面回傳
     c、)   存在大量無用的ViewState

     d、)   asp.net 網站前台資料列表顯示用的GridView .

的時候我把我的簽名改成 “我內傷了!”

 

    或許以上我的說法您不認可,不過沒關係。我也抱著學習的態度虛心接受您的建議。

歡迎拍磚。

 

    敬請期待下一篇:談談Asp.net網站最佳化二:關於 伺服器控制項 和  用戶端控制項(html標籤)的選擇

     本文首發 http://blog.codepubs.com/archives/131  轉載請註明出處

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.