熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

剖析.Net下的數據訪問層技術(2)

2013-11-23 19:30:02  來源: Java核心技術 

  其它
  結束ADONET剖析前不得不提提DataReader與DataSet間的兄弟之爭
  
  就作者所看過的資料幾乎所有的都建議實際情況具體分析剩下很少很少的則全憑個人習慣決定
  
  在學習ADONET時作者也是抱著這樣的想法並反復牢記資料上總結的那些條款(就像當年學習GOF 條時那樣幾乎可以倒背如流了J)想到終有一日也可在ADONET下大展神威了
  
  可惜現實不隨人願連續做了幾個項目無論規模大小竟然全部采用了DataSet解決方案!
  
  此時再回頭看看學習ADONET時打開最為頻繁的PetShop項目兩相一比較這才看出些許端倪
  
  簡單的說PetShop采用了如下這種曲線救國的方式來實現數據交換
  
  DataReader獲取數據 => 創建數據實體類 => 根據字段類型填充數據實體類 => 將數據實體添加到列表類中(僅針對返回超過一條數據的場合)
  
  (補充采用數據實體類或者集合類可以比較方便的實現Cache Manament而普通的DataReader由於其數據讀取方式限制無法滿足這種需求)
  
  這個過程與DataAdapterFill() 所所產生的效果大同小異只不過
  
  在Fill() 中DataAdpater自動創建DataReader去獲取數據之後創建DataTable(相當於數據實體類)並根據字段類型填充DataTable當然如果可能返回多條記錄DataTable完全可以處理就沒必要去實現列表操作了
  
  可能讀者馬上產生了疑問既然如此PetShop中為何還需要數據實體類呢?這其中還是有一些差別的
  
  首先數據實體類是輕量級的structure一般僅包含數據字段沒有
  
  什麼操作方法這比DataTable或者DataRow還是有一些性能上的優勢(在數據量不大時可以忽略不計)另一方面數據實體類的操作相對簡單不需要開發人員具備任何ADONET知識(其實就DataTable來說這也不算什麼問題)點點屬性就可以了
  
  不過根據作者的實踐來看這兩方面似乎還不足以使人轉而使用DataReader方案理由列舉如下
  
  ()  對於數據量較大的場合可以采用分批讀取的方式這有點類似DataGrid的數據分頁效果
  
  ()  對於簡單的數據實體類還能應付一旦涉及關聯數據就只能另外撰寫方法了而所有這些在DataSet中是非常容易處理的(對於企業級應用大部分情況都需要處理比較復雜的數據)
  
  ()  DataTable天生就支持數據集合操作這樣的特性比集合+實體的混合模式(PetShop)更容易控制也更自然
  
  ()  實體類在聲明時需要確定所有數據類型當進行數據填充時就需要DataReader再次關注實體所對應的數據類型不能有絲毫差錯!在這方面DataTable就顯得非常方便操作時只需要一次類型關注即可
  
  ()  DataSet解決方案可以非常方便的支持序列化操作(如RemotingWebServices)同時與XML的關系更是親密無比這對於和其它系統的交互來說也是至關重要的
  
  分析過一些技術和方案相信讀者朋友已有一些體會值此收官之際如果非要在這裡提供一個綜上所述那作者的建議就非常明確在企業級應用開發中盡可能的采用DataSet(DataTable / DataView)+ Cache Management解決方案!
  
  其它開發中只在如下種情況才考慮使用DataReader(就作者經驗來說大部分使用DataReader都屬第2種情況)
  
  ()  對資源要求比較苛刻的場合這裡的資源主要指內存和數據庫連接
  
  ()  希望在讀取數據庫返回結果集時作自定義處理例如在讀取一條記錄後立刻終止處理或者在讀取時作計算操作
  
  (提示這種情況類似於XML中的SAX(Simple API for XML)技術無需一次性讀入所有XML數據即可進行操作相反的DOM(Document Object Model)則要求必須裝載所有XML數據後才能開始操作(MSXML已開始允許只讀取XML文檔部分數據即可開始操作這是後話)!)
  
  ()    只希望得到返回記錄數或者返回記錄的部分字段
  
  string GetNameByID(int nID) //根據員工ID返回員工姓名這裡只需要
  
  // 讀取姓名字段
  
  (提示這種情況一般可以通過執行特定的查詢或存儲過程直接解決)
  
  ()  出於某些方面的考慮(例如nTier系統中嚴格區分各Layer間的職責)無法(或者禁止)通過數據庫本身進行查詢過濾這時就只有使用DataReader在讀取時進行過濾操作!
  
  (提示雖然DataView也能達到這種目的但它的過濾前提是必須讀取到所有返回數據所以性能上不如DataReader!)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26977.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.