利用C#實現分散式資料庫查詢

來源:互聯網
上載者:User

隨著傳統的資料庫、電腦網路和數字通訊技術的飛速發展,以資料分布儲存和分布處理為主要特徵的分散式資料庫系統的研究和開發越來越受到人們的關注。但由於其開發較為複雜,在一定程度上制約了它的發展。基於此,本文提出了在.Net環境下使用一種新的開發語言C#結合ADO.Net資料訪問模型來開發分散式資料庫系統,大大簡化了開發過程。

  1 分散式資料庫系統

  就其本質而言,分散式資料庫系統的資料在邏輯上是統一的,而在物理上卻是分散的。與集中式資料庫相比它有如下主要優點:

  · 解決組織機構分散而資料需要相互聯絡的問題。

  · 均衡負載。負載在各處理機間分擔,可避免臨界瓶頸。

  · 可靠性高。資料分布在不同場地,且存有多個副本,即使個別場地發生故障,不致引起整個系統的癱瘓。

  · 可擴充性好。當需要增加新的相對自主的組織單位時,可在對當前機構影響最小的情況下進行擴充。

  分散式資料庫系統雖然有諸多優點,但它同時也帶來了許多新問題。如:資料一致性問題、資料遠程傳遞的實現、通訊開銷的降低等,這使得分散式資料庫系統的開發變得較為複雜。幸運的是,微軟的.Net開發環境為我們提供了C#開發語言和ADO.Net資料訪問模型,結合兩者來開發分散式資料庫系統能夠大大簡化開發工作。

  2 遠端架構和ADO.Net

  開發分散式資料庫系統需要解決的兩個重要問題是:各場地間的資料通訊以及對資料庫的操作及管理。使用C#結合ADO.Net能夠高效、可靠地解決這兩方面的問題。具體表現為,在C#中通過使用.Net遠端架構能夠方便地解決資料、命令遠程傳遞問題;C#通過ADO.Net對資料庫進行操作,使分散式資料庫系統中對資料庫的各種操作變得高效、可靠,同時易於解決資料一致性問題。

  2.1 .Net遠端架構

  實現資料和命令的遠程傳遞有三種方式。第一種是使用報文或訊息的方式,把要傳送的資料轉化為流格式,再通過通訊端編程用報文的形式發送到遠程主機。此種方法麻煩,不易實現。第二種是使用Web Service,即各遠程主機提供一個資料庫查詢服務的Web Service。這種方式只能對單個場地進行查詢,無法實現多場地的聯集查詢。第三種是使用.Net遠端架構(.Net Remoting Framework)技術,它將遠程調用的技術細節隱藏起來,服務程式只需通過簡單的設定就可以把本機物件變成為遠程提供服務的遠程對象,用戶端可以像訪問本機物件一樣透明地訪問遠程對象,所有的訊息、報文等都交給.Net Remoting對象處理,大大簡化了開發。遠端的一般過程1所示:

圖1 遠端過程

  首先,伺服器端建立一個伺服器類的執行個體,遠端系統建立一個表示該類的代理對象,並向用戶端對象返回一個對該代理的引用。當用戶端調用方法時,遠端基礎結構串連檢查類型資訊,並通過通道將該調用發送到伺服器處理序。偵聽通道獲得該請求並將其轉寄給伺服器遠端系統,伺服器遠端系統尋找(或在必要時建立)並調用被請求的對象。然後,此過程將反向進行,伺服器遠端系統將響應捆綁成訊息並由伺服器通道發送到用戶端通道。最後,用戶端遠端系統通過代理將調用的結果返回給用戶端對象。

  2.2 ADO.Net

  ADO.Net以XML為核心,是.Net資料庫應用程式的解決方案。它使用離線資料結構,資料來源中的資料被緩衝到資料集(DataSet)對象中,使用者無須鎖定資料來源,資料以XML格式儲存。

  2.2.1 ADO.Net管理資料一致性

  在分散式資料庫系統中,很可能出現多個使用者同時訪問和修改資料的情況,因此,對於分散式資料庫系統,資料一致性是不可或缺的。ADO.Net通過使用樂觀一致性方案來控制資料一致性(實際上DataSet對象被設計成支援使用樂觀一致性控制機制),即資料行只有在資料庫中真正被更新時才會被鎖定,而在悲觀一致性方案中,資料行在從被提取出來到在資料庫中更新這段時間內一直被鎖定。因此,使用ADO.Net能夠在更少的時間內響應數量巨大的使用者。

  另外,在分散式資料庫系統中,還會經常遇到當使用者修改自從提取出來以來已經被修改的行時,違反一致性原則。對此問題ADO.Net也作了很好地解決,即使用DataSet對象為每一條修改過的記錄維護兩個版本:原始版本和更新版本,在更新的記錄被寫回資料庫之前,先要把資料集中記錄的原始版本與資料庫中的目前的版本進行比較,如果兩個版本匹配,就在資料庫中更新記錄;否則,就會出現違反一致性原則的錯誤。

  3 執行個體開發

  一個家用電器連鎖店設有一個總部和許多分店,總部和分店以及各分店之間經常需要進行各種資訊的查詢(如:商品當日價目表、各店銷售狀況和庫存資訊等),對此組織機構建立分散式資料庫查詢系統,可實現總部和各店資訊的共用,便於統一管理。

  3.1 系統設計

  3.1.1系統結構圖

  系統結構2所示:


圖2 系統結構圖

  總部和各分店都配置了一台具有固定IP的伺服器,其它電腦通過集線器與伺服器相連,總部和各分店的伺服器通過通訊網路聯結起來。

  3.1.2 系統實現步驟

  系統實現分為三個主要步驟。首先,為總部和各分店設計資料庫。由於資料量較大,故採用SQL Server為每個分店建立銷售和庫存資料庫,同時為總部建立員工資料庫、整個連鎖店的存貨資料庫、信用卡客戶資料庫以及供應商資訊資料庫等。其次,需要建立一個提供資料庫服務(DbServer)的動態連結程式庫(dll),將查詢時所要用到的一些服務(如:遠程對象的發布和擷取等)和函數(如:本地異地資料表的查詢、資料表的遠程建立和刪除、表間的串連和合并等)置入該dll中,各分店都需要使用這個dll,以便查詢時對一些服務和函數進行調用。最後,根據實際需要開發用戶端查詢介面。

  3.2系統實現的關鍵技術

  3.2.1 遠程對象的發布與擷取

  系統運行後所要做的第一個工作是發布本地的遠程對象並擷取其它各店所發布的遠程對象。發布遠程對象時,首先要設定一個網路連接埠號碼,然後建立並註冊一個通道,最後發布該伺服器端的啟用物件。其它場地的伺服器根據IP地址和網路連接埠號碼即可方便地擷取所發布的遠程對象。實現遠程對象發布和擷取的關鍵代碼如下:

  遠程對象的發布:

//建立一個通道執行個體,port為指定的網路連接埠號碼
TcpChannel MyChannel= new TcpChannel (Int32.Parse(port));
//註冊通道
ChannelServices.RegisterChannel(MyChannel);
//發布該伺服器端啟用物件
RemotingConfiguration.RegisterWellKnownServiceType( typeof ( DbServer ), "STORE", WellKnownObjectMode.Singleton);
遠程對象的擷取:
//根據IP地址和連接埠號碼擷取相應的遠程對象
try
{myDbServer=(DbServer)Activator.GetObject(typeof(DbServer),"tcp://"+ip+":"+p+"/STORE"); }
//捕捉異常
catch( NullReferenceException nullExp )
{MessageBox.Show( "指定的url地址不可到達 " + nullExp.Message );}
catch( RemotingException remExp )
{MessageBox.Show( "指定獲得的對象定義不對" + remExp.Message );}

  3.2.2資料庫的訪問

  通過ADO.Net訪問資料庫,可以方便地串連資料庫,將資料來源中的資料匯入DataSet對象中,在DataSet對象中可對資料表進行各種操作,而且DataSet對象本身也可遠程傳遞。這為開發分散式資料庫系統帶來極大方便。實現資料庫訪問的關鍵代碼如下所示:

//建立資料庫的串連
string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;";
SqlConnection Conn= new SqlConnection
(SqlConn);
Conn.Open();//開啟資料庫
//將資料來源中的資料匯入到資料集對象
try{
DataSet ds = new DataSet();
DataTable dt=new DataTable("Result");
SqlDataAdapter adapter=new SqlDataAdapter();
SqlCommand mySqlDataSetCmd =new SqlCommand
(CmdString,Conn);//CmdString為要執行的命令
adapter.SelectCommand= mySqlDataSetCmd;
adapter.Fill(dt);
ds.Tables.Add(dt); }
finally
{ Conn.Close();//關閉資料庫的串連}

  3.2.3 查詢

  分散式資料庫系統中的查詢一般分為三類:本地查詢、遠程查詢和聯集查詢。本地查詢和集中式資料庫的查詢沒什麼區別;對於遠程查詢,只要擷取遠程對象後,調用查詢函數,即可方便地實現;最複雜的是聯集查詢,涉及到多場地之間資料的查詢、表的遠程建立、傳遞、串連、合并等技術。下面以執行個體介紹聯集查詢的實現。

  第二連鎖店要查詢離其較近的第三、第四連鎖店中所有北京的供應商所供應的空調的庫存資訊以便調貨,可通過以下步驟實現。首先,擷取總部以及第三、第四連鎖店所發布的遠程對象。接著,通過遠程對象在總部建立一臨時資料表t1,將查詢到的所有北京的供應商資訊存放在t1表中(各分店只有供應商名,並不知其所在地,只有總部才有供應商的詳細資料),再將t1表儲存到第三和第四連鎖店。然後讓t1表分別與兩店的庫存表作串連,找出所有北京供應商所供應的空調庫存資訊(如空調名稱、型號、個數、價格等資訊),並將串連結果t2和t3資料表返回到第二連鎖店。最後對t2和t3兩表進行合并,並使用DataGrid控制項顯示出來。上述實現中,包含了不同場地之間資料表的複製、傳遞、串連等,所用到的一些函數(如:遠程建立資料表、表與表間的遠端連線、合并等)都放在dll中,可以方便地調用。

  4 結束語

  利用C#的.Net Remoting技術能夠方便地解決各場地間資料的通訊問題。另外,C#通過ADO.Net訪問資料庫,使得對資料庫的操作及管理變得更加高效、可靠。這兩種技術的使用,有效地解決了開發分散式資料庫系統的主要問題,大大減輕了系統開發工作量,並且提高了系統的可靠性和安全性。

相關文章

聯繫我們

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