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

基於單件模式的數據庫連接組件的設計

2013-11-13 10:00:05  來源: .NET編程 

  摘 要當前在開發多用戶信息管理系統時常用的數據庫連接方法存在著不足當客戶端較多時會在服務端建立過多的連接占用服務器很多寶貴的資源針對這種不足提出一種改進的方案結合單件設計模式的特點和組件的技術建立了一個數據庫連接組件通過調用該連接組件可以實現應用程序中的所有訪問數據的操作共用一個連接的目的從而減輕了服務器的負擔提高了程序性能經實際測試該設計達到了預期的效果

  關鍵字DOTNET組件數據庫連接設計模式

  引言

  目前無論是基於C/S結構或是基於B/S結構的信息管理系統一般都采用多層結構設計也即表示層業務邏輯層數據訪問層數據庫在這種多層結構的設計中客戶端直接通過廣域網或局域網與數據庫進行交換數據由於數據庫(如Oracle或SQL Server)支持的用戶有限如果連接的用戶過多數據庫將出現異常影響數據庫的處理能力同時客戶端可能打開多個訪問的頁面有可能每一個頁面請求將導致一次數據庫訪問連接數據庫不僅要開銷一定的通訊和內存資源還必須完成用戶驗證安全上下文配置任務因而往往成為最為耗時的操作如果每個基於數據庫的應用程序只建立一次初始連接不同頁面請求能夠共享同一連接就能獲得顯著的性能改善本文將介紹一種基於單件設計模式的組件設計技術實現這一要求的方法

   設計模式

  所謂模式就是一些能夠完成特定任務並達到完成工作的方案途徑或現成技術一個模式是一種技術為了完成某項工作我們必須獲取並利用有效的技術這種思想也可以用於除軟件開發領域之外的其他工作中在軟件開發領域我們稱之為設計模式它就是一種完成某個目的或構想的方案而且它要求使用某種面向對象語言提供的類以及相關機制如果開發人員在設計代碼時加入設計模式的思想可以使使用面向對象語言編寫出的程序更簡潔而且工作得更可靠高效

  單件模式是《Design Patterns》一書(GoF——四人小組編寫)中描述了種設計模式中的一種單件模式就是要求類生成且僅能生成一個實例它的實現細節可參見後面的代碼

   認識軟件組件技術

  隨著計算機軟件技術的發展組件技術在軟件開發領域得到越來越多的應用組件技術已經成為計算機環境中的基本組成之一軟件組件是可復用的軟件組成成分可被用來構造其他軟件他可以是被封裝的對象類類樹一些功能模塊軟件框架軟件構架文檔分析件設計模式等其具有獨立性互換性功能性通用性預制性等性質軟組件技術是基於面向對象的以嵌入後馬上可以使用的即插即用型軟件組件概念為中心通過組件的組合來建立應用的技術體系

  Microsoft的VSNET系統開發工具提供了對組件模型的實現支持我們建立一個基於ADONET數據庫公共連接組件以供以後開發中使用或者供其他開發者使用實現一個應用程序只使用一個數據庫連接

  DOTNET中的連接池的管理機制及其不足

  DOTNET系統自己提供連接池管理的機制

  ()池的創建與分配

  當連接打開時將根據一種精確的匹配算法來創建連接池該算法會使連接池與連接中的字符串相關聯?每個連接池都與一個不同的連接字符串相關聯當新連接打開時如果連接字符串不精確匹配現有池則將創建一個新池連接池一旦創建直到活動進程終止時才會被毀壞非活動或空池的維護只需要最少的系統開銷

  ()連接的添加

  連接池是為每個唯一的連接字符串創建的當創建一個池後將創建多個連接對象並將其添加到該池中以滿足最小池大小的要求連接將根據需要添加到池中直至達到最大池大小

  當請求 SqlConnection 對象時如果存在可用的連接則將從池中獲取該對象若要成為可用連接該連接當前必須未被使用具有匹配的事務上下文或者不與任何事務上下文相關聯並且具有與服務器的有效鏈接

  如果已達到最大池大小且不存在可用的連接則該請求將會排隊當連接被釋放回池中時連接池管理程序通過重新分配連接來滿足這些請求對 Connection 調用 Close 或 Dispose 時連接被釋放回池中

  () 連接的移除

  如果連接生存期已過期或者連接池管理程序檢測到與服務器的連接已斷開連接池管理程序將從池中移除該連接請注意只有在嘗試與服務器進行通信後才可以檢測到這種情況如果發現某連接不再連接到服務器則會將其標記為無效連接池管理程序會定期掃描連接池查找已釋放到池中並標記為無效的對象找到後這些連接將被永久移除

  ()DOTNET中自帶的連接池管理機制存在著一定的不足

  第一建立的連接一定要及時關閉如果程序員在編寫程序的時候未將打開的連接關閉當連接數目達到一定數目的時候系統就會因為連接數過大而不能正常運行

  第二DOTNET自帶的連接池存在不穩定性如果存在與已消失的服務器的連接那麼即使連接池管理程序未檢測到已斷開的連接並將其標記為無效仍有可能將此連接從池中取出當發生這種情況時將生成異常但是為了將該連接釋放回池中仍必須將其關閉

  對於上述不足在應用程序中進行處理顯然是以犧牲應用程序的性能為代價的甚至是難以處理的

   基於單件模式的數據庫連接組件解決方案

  在一個應用程序中共用一個數據庫連接當有用戶啟動此應用程序的時候系統將檢查當前連接的狀態如果連接是關閉的就打開這個連接在整個應用程序執行期間該連接始終保持打開狀態下一個用戶進入應用程序需要連接數據庫時就直接使用當前已經打開的連接當所有用戶都退出應用程序觸發DOTNET應用程序的ApplicadonEnd事件在此事件中將該連接關閉在應用程序運行期間共用一個連接的情況下用戶對數據庫數據的操作通過事務來控制以保證在一個公用連接下數據的並發操作

  通過此方案可以很好的解決DOTNET中自帶的連接池管理機制存在的不足

  要使所作的組件能夠作為公共連接組件使用具有一定的可復用性必須首先確立組件的組件模型使它具有統一的接口和規范根據組件模型開發應用組件 NET Framework 中組件是指實現 SystemComponentModelIComponent 接口的一個類或從實現 IComponent 的類中直接或間接派生的類另外NET Framework 還提供控制外部資源和設計時支持等功能如果設計的組件需要控制外部資源還必須擴展 SystemIDisposable 接口即在組件重載 Dispose 方法實現中組件必須顯式釋放外部資源與垃圾回收過程中發生的默認不確定的清理相比這提供了一個確定的方法來釋放資源開發人員必須在整個包容層次結構中傳播 Dispose 以確保組件的子級也釋放資源而且派生的組件必須調用其基類的 Dispose 方法由於數據連接組件所占系統資源很少所以不考慮擴展SystemIDisposable接口組件類繼承自IComponent接口組件只提供一個生成實例的接口(CreateConn)和一個獲取打開連接的接口供用戶調用

   組件實現

  考慮到網絡安全性和易維護性將數據庫連接字符串放在應用程序服務器下的一個XNL文件中在程序運行時讀取XML文件獲取數據庫連接字符串傳遞給連接組件應用程序通過調用連接組件打開連接並返回一個數據庫連接實例在整個應用程序中使用這個數據庫連接實例就可以在應用程序結束時關閉連接如果數據庫連接有所變動可以通過XML文件進行修改免去了數據庫連接變動就要修改源程序代碼的麻煩

  C#實現的基於單件模式的ADONET數據庫公共連接組件代碼如下

  namespace UtilitiesCommon

  {

  public class DataConnection

  {

  private static SqlConnection _conn = null;

  private string _connString;

  private static object _classlock = typeof(DataConnection);

  private static DataConnection _dc;

  private static bool instance_flag=false;

  private DataConnection() //定義私有構造函數防止用戶生成實例

  {

  _connString = getConnString();

  }

  private string getConnString()

  {

  XmlDocument doc = new XmlDocument();

  docLoad(connxml); //數據庫連接設置的XML文件

  string returnval = docDocumentElementChildNodes[]FirstChildValue;

  doc = null;

  return returnval;

  }

  public static DataConnection CreateConn() //靜態類對外生成實例的接口

  {

  lock(_classlock) //生成實例前加鎖保證只生成一個連接實例

  {

  if(!instance_flag)

  {

  _dc = new DataConnection();

  }

  }

  return _dc;

  }

  public SqlConnection Open()

  {

  if(_conn==null)

  {

  _conn = new SqlConnection(_connString);

  _connOpen();

  }

  return _conn;

  }

  public void Close()

  {

  if(_connState == SystemDataConnectionStateOpen)

  {

  _connClose();

  _conn = null;

  }

  }

  }

  }

  connXML文件的格式如下

  

  

  Server=(local);uid=sa;pwd=;database=pubs

  

  

  將名為DataConnection的組件經編譯生成DLL文件後就可以在其他項目中引用此組件只要按connXML文件的約定建立好數據庫的連接字符串在應用程序中通過調用該組件的Open()方法就可以獲取連接到指定數據庫的連接在應用程序中使用該組件的示例代碼如下

  DataSet ds = new DataSet();

  SqlDataAdapter da = new SqlDataAdapter(select * from jobs

  UtilitiesCommonDataConnectionCreateConn()Open());

  daFill(ds);

   結論

  經過在一些實際應用程序中的使用充分證明了該組件確實能有效地改善應用程序的性能充分利用和保護了服務器的寶貴資源

  參考文獻

  [] 郭玲玲邊小凡 《DOTNET Web應用程序中公共連接組件的實現》 微機發展()

  [] [美]Steven John Metsker 《C#設計模式》 中國電力出版社

  [] 丁書耕張路崎辛艷芬《基於DOTNET平台的應用程序開發框架的研究》微機發展()

  [] 李桂麗劉悅田瑩 《可復用組件的制作和組裝》鞍山鋼鐵學院學報()


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