熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET實用技巧兩則

2013-11-13 10:54:16  來源: .NET編程 

  要想充分發揮ADONET的優勢不僅需要全面深入理解ADOnet編程模型及時總結經驗技巧也十分重要ADO已經有多年的實踐經驗ADONET以此為基礎提供了更加豐富強大的工具盡管如此ADONET的設計目標畢竟不是提供一個即插即用的工具它不會把所有的編程工作簡化到僅靠鼠標點擊就可以完成的程度
  
  ADONET包含了一大堆代表數據訪問模型中各種邏輯實體的對象其中尤以連接事務這兩個對象最為重要連接的作用是建立一個與後端數據庫通信的通道創建連接對象必須以特定的NET數據提供者為基礎事務對象可以在已有的連接對象上創建也可以通過顯式地執行一個BEGIN TRAN SQL語句創建雖然理論很簡單但實際上圍繞連接事務的不確定因素很多而且它們對應用整體的穩定性和效率有著至關緊要的影響

  如何保存連接字符串保護連接字符串中可能包含的敏感信息(例如密碼)?怎樣設計一個完善的數據訪問策略既考慮到安全性(即身份驗證授權)卻又不至於對性能和可伸縮性造成太大的影響?如果需要用到事務那麼如何高效地實現和控制事務?采用自動事務還是手動事務?在使用ADONET時這些問題都必須仔細考慮

  一連接字符串連接池

  數據庫連接是一種重要的有限的開銷昂貴的資源因此用好連接對象是任何應用的最基本的要求使用數據庫連接的要點可總結如下

  保存連接字符串應注意安全
  打開連接應遲關閉連接應早
  連接字符串是訪問數據庫的鑰匙連接字符串除了說明要訪問的數據之外還包含了用戶為什麼可以訪問那些數據的身份證明在執行數據庫操作時用戶身份證明是確定數據訪問權限的最重要的因素

   保存連接字符串

  目前硬編碼的連接字符串具有最好的性能因為它們直接編譯進了應用的代碼之中然而硬編碼的字符串影響程序的靈活性一旦連接字符串改變應用程序必須重新編譯

  將連接字符串保存到外部提高了靈活性代價是訪問外部字符串需要付出額外的開銷但在絕大多數情況下由此導致的性能開銷可以忽略不計真正需要擔心的是安全問題例如攻擊者可能修改竊取連接字符串將連接字符串保存到外部環境的常見途徑有配置文件UDL文件Windows注冊表

  NET框架配置文件以純文本文件的形式部署訪問方便如果連接字符串包含密碼文本格式將是最大的缺陷所在因為密碼將以明文的形式保存可以考慮引入一個專用的加密/解密引擎不過這部分工作需要開發者自己完成

  UDL文件是供OLE DB提供者使用的文本文件也就是說SQL Server托管提供者不支持UDL文件UDL文件也存在和前面的配置文件一樣的安全問題總地看來優勢不多

  最後Windows注冊表可以作為一個天然安全的存儲場所注冊表是一個保存關鍵信息的系統知識庫如果結合運用加密技術可以達到較高的安全性使用注冊表的主要缺點是部署麻煩要求創建注冊鍵(可能還要執行加密)以及從注冊表讀取數據雖然NET Framework提供了一組調用底層Win API的封裝類但這些類都沒有提供加密功能ASPnet_setregexe工具可以用來創建HKEY_LOCAL_MACHINE下的注冊鍵保存用戶名稱和密碼例如aspnet_setregexe k Software\MyData u:userID p:password該命令將加密指定的用戶ID和密碼

   連接池原理

  連接池允許我們通過一個緩沖池重用現有的連接對象避免每次使用連接對象時都要新建一個對象采用連接池之後只要少量的連接對象就可以滿足大量客戶端的需要

  每一個連接池都與一個獨立的連接字符串及其事務上下文關聯每次打開一個新的連接數據提供者會嘗試將指定的連接字符串與連接池的字符串進行匹配如果匹配失敗數據提供者創建一個新的連接並將它加入連接池連接池被創建之後除非進程結束否則不會被拆除有人認為這種處理方式會影響性能其實不然維護一個不活動的或者空的連接池不需要多少開銷

  連接池創建之後系統會創建一些連接對象並將它們加入連接池直至達到額定的最小連接對象數量以後系統會根據需要新建和加入連接對象一直到達最大連接對象數量限額為止如果程序請求一個連接對象時沒有空閒的連接對象可用且連接池裡面的對象數量已達到上限則請求被放入隊列一旦有連接被釋放回緩沖池就立即取出使用

  避免用編程的方式構造連接字符串如果通過合並多個輸入數據的方式構造出連接字符串很容易給注入式攻擊以可乘之機如果必須用到用戶輸入的數據務必進行嚴格的驗證

   關閉連接

  關閉一個連接時連接對象被返回給連接池以便重用但這時實際的數據庫連接並未被拆除如果禁用了連接池則實際的數據庫連接也被關閉這裡必須強調的一點時連接對象使用完畢後應當顯式關閉並將它返回給連接池不要依靠垃圾收集器來釋放連接實際上當連接對象的引用超出有效范圍時連接不一定被關閉——垃圾收集器的功能是拆除代表物理連接的NET封裝對象但這並不意味著底層的連接也被關閉了

  調用Close或Dispose方法可以將連接釋放回連接池只有當生存期結束或出現嚴重錯誤時連接對象才會被從連接池刪除

   連接池與安全

  如果一個應用程序的所有數據訪問操作都使用同樣的連接字符串連接池的優勢將發揮到極限但是這只是一種理想化了的狀況很可能與應用程序的其他要求存在沖突例如如果只使用一個連接字符串要在數據庫這一層次上執行安全控制就很困難了

  另一方面如果讓每一個用戶分別使用自己的連接字符串(即為每一個用戶分別設定數據庫帳戶)勢必出現大量小型的連接池許多連接根本不會被重用依照慣例這類問題的最佳解決方案是尋找兩個極端之間的一個適當折衷點我們可以設置一組具有代表性的公用帳戶同時修改存儲過程使之接受一個表示用戶標識的參數存儲過程根據傳入的用戶標識執行不同的操作

  二事務模式

  分布式企業應用離不開事務在數據訪問代碼中加入事務管理功能主要有兩種方式手動方式自動方式

  在手動方式中程序員負責編寫所有配置使用事務機制的代碼自動(或COM+)事務則在net類中加入聲明式屬性指定運行時對象的事務特性自動方式方便了將多個組件配制成在同一個事務之內運行兩種事務方式都支持本地的或分布式的事務但自動的事務方式極大地簡化了分布式事務處理

  必須注意的是事務是一種開銷很大的操作所以決定使用事務之前務必再三考慮如果確實需要使用事務那就要盡量縮小事務的粒度減少對數據庫的加鎖時間加鎖范圍例如對於SQL Server單個的SQL語句不需要顯式地聲明事務SQL Server會自動將每一個語句作為一個獨立的事務運行手動的本地事務總是比其他事務快得多因為它不需要涉及DTC(Distributed Transaction Coordinator)

  手動事務自動事務應當視為兩種不同的互斥的技術如果要在單個數據庫上執行事務性操作優先考慮手動事務當單個事務跨越多個遠程數據庫或單個事務涉及多個資源管理器(例如一個數據庫和一個MSMQ資源管理器)優先考慮自動事務不管怎樣應當極力避免混合運用兩種事務模式如果性能不是特別重要即使只對一個數據庫操作也可以考慮使用自動事務使代碼更加簡潔(但速度略慢)

  總而言之要提高數據庫訪問代碼的質量必須深入了解ADONET對象模型根據實際情況靈活運用各種技巧ADONET是一個公用的API各種應用——不管是Windows窗體應用ASP頁面還是Web服務都可以通過ADONET訪問數據庫但是ADONET不是一邊接受輸入一邊吐出結果的黑箱而是一個由許多工具組成的工具箱


From:http://tw.wingwit.com/Article/program/net/201311/14739.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.