程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET Remoting構建分布式數據庫查詢

.NET Remoting構建分布式數據庫查詢

編輯:關於.NET

引言

隨著傳統的數據庫、計算機網絡和數字通信技術的快速發展,以數據分布存儲和分布處理為主要特征 的分布式數據庫系統的研究和開發越來越受到人們的關注。微軟提供了兩種解決方案來為用戶實現數據服 務,即 .NET Remoting 和 Web Service 技術。眾所周知,Web Service 技術已經是業界中一種公認的標 准數據傳輸方案,它基於 HTTP 之上,可以輕松穿過防火牆;而 Remoting 技術則是在 .NET 環境下,在 應用程序內部或應用程序域之間傳輸數據的方案,它有幾種通道可以在數據傳輸中使用,選擇適當的通道 同樣可以達到穿越防火牆。然而,在一個封閉的網絡環境中,選擇TCP通道將獲得更好的連接性能,這種 情況下,無疑 .NET Remoting具有明顯的優勢。

Remoting 框架簡介

.NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架。這種框架提供了多 種服務,包括激活和生存期支持,以及負責與遠程應用程序進行消息傳輸的通訊通道。而且,.NET Remoting 是一個內容豐富的、可擴展的框架,它使得分布在不同應用程序域(AppDomain)、不同進程和不 同計算機上的對象可以實現無縫通信。它提供的編程模型和運行時支持,功能強大且非常便捷,能夠實現 透明的交互。

理解Remoting框架

1、基本原理

圖1 .NET Remoting體系結構圖

.NET Remoting中通過通道(channel)來實現兩個應用程序域之間的對象通信。Remoting的通道主要 有兩種:Tcp和Http。在.NET中,System.Runtime.Remoting.Channel中定義了IChannel接口。IChannel接 口包括了TcpChannel通道類型和Http通道類型。它們分別對應Remoting通道的這兩種類型。通道對象代表 了到遠程應用程序的連接。每個通道對象還包含格式化程序對象,將方法調用轉換為已知格式的消息。

其基本原理如圖1所示,首先,客戶端通過通道訪問服務器端對象,以獲得服務器端對象的代理。服務 器端對象也即通常所說的遠程對象,使用時是通過跨應用程序邊界傳遞對象引用獲得該遠程對象的代理。 對於客戶程序來說,代理提供了與遠程對象完全一樣的方法和屬性。當代理的方法別調用時,就會創建消 息,通過使用格式化程序類,將這些消息串行化並發送到客戶通道中。客戶通道和服務器通道進行通信, 以通過網絡傳輸消息。服務器通道則使用格式化程序並行化消息,從而將方法發送給遠程對象。通過代理 ,客戶端應用程序就可以像使用本地對象一樣來操作遠程對象。

2、應用程序域

Windows操作系統將應用程序分離為單獨的進程,形成應用程序代碼及其數據的保護邊界。雖然進程在 隔離應用程序方面是有效的,但同樣有缺點:首先,進程屬於低級的操作系統結構,管理進程要涉及很多 操作系統行為;其次創建和管理進程是一項非常昂貴的任務,如果不采用進程間通信(Interprocess Communication,IPC)機制,在一個進程中執行的代碼就不能訪問另一進程,而采用IPC 機制的額外開銷 往往使得最後得不償失。在很多情況下,我們需要一個對象跨過應用程序域,與另一對象進行交互。.NET 所引入的應用程序域對上述問題進行了很好的解決。應用程序域是 .NET 運行庫的邏輯進程表示,任何實 際的操作系統進程可以包含多個應用程序域。應用程序域具有以下優點:

隱藏了進程具體的操作系統信息。

應用程序域同樣提供了隔離,所有 .NET 對象都界定在創建它的應用程序域中。

對於不需要昂貴的IPC 機制的進程,應用程序域允許 .NET 運行庫優化運行於其中的應用程序間的通 信。

3、遠程對象的激活方式

遠程對象派生自System.marshalByRefObject類,訪問遠程類型的一個對象實例之前,必須通過一個名 為Activation的進程進行創建並初始化。這種客戶端通過通道來創建遠程對象的行為稱為遠程對象的激活 。在Remoting中,遠程對象的激活分為兩大類:

服務器端激活:又稱為WellKnown方式,通過這種方式激活的對象稱為服務器端激活對象或者知名對象 。這是因為服務器端應用程序在激活對象實例之前會通過一個眾所周知的統一資源標識符(URI)來發布這 個類型。.Net Remoting把服務器端激活又分為Singleton模式和SingleCall模式兩種。Singleton模式即 指運行庫只創建一個對象接受所有的客戶端請求,並通過租賃策略控制其生存期;而在SingleCall模式中 ,運行庫將為每個客戶端請求建立一個新對象,並在完成請求後釋放這個對象,由垃圾收集器(GC)進行 銷毀。

客戶端激活:在這種模式下,一旦服務器端獲得客戶端的請求,將為每一個客戶端都建立一個實例引 用。雖然這種模式與服務器端激活的SingleCall模式有些相似,但它們是有區別的:第一,SingleCall模 式激活的對象是無狀態的,對象生命期的管理是由GC負責的;而客戶端激活的對象則有狀態,其生命周期 可以自定義;第二,SingleCall模式在調用對象方法時創建對象實例,而客戶端激活方式在客戶發出調用 請求時進行實例化;第三,SingleCall模式下,只能調用對象默認的構造函數,不能通過傳遞參數調用自 定義的構造函數來創建對象實例,而客戶端激活模式可以調用自定義的構造函數來創建實例。

4、配置文件

除了通過編程的方式發布遠程對象外,還可以使用配置文件對服務器端應用程序進行配置。使用配置 文件的優點在於:

用戶無需修改任何代碼,就可以配置通道和遠程對象,而且,不需要重新編譯應用程序。

大大減少了用於實現遠程對象所必須編寫的代碼。

下面是一個服務器端通過SingCall模式激活遠程對象的配置文件(命名為:DbServer.exe.config):

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode = "SingleCall"
type = "DbServerLibrary.DbServer, DbServerLibrary"
objectUri = "DbServer "/>
</service>
<channels>
<channel ref = "tcp" port = "8888" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

如果是客戶端激活模式,則把wellknown改為activated,同時刪除mode屬性。然後,只需要使用下面 一行代碼就可以發布遠程對象:

RemotingConfiguration.Configure("DbServer.exe.config");

同樣,客戶端也可以使用配置文件來獲得對遠程對象的引用,在使用上述一行代碼後,只需要簡單使 用new運算符(還可采用其他方法)即可以像操作本地對象一樣來操作遠程對象。由此可見,.NET Remoting 為用戶提供了非常靈活便捷的方式來發布和獲取遠程對象,同時提供了方便的部署應用程序方案。

系統的實現及相關技術

1、分布式數據庫

分布式數據庫是一組邏輯上屬同一系統,但物理上分布在計算機網絡的不同結點的結構化數據的集合。 與集中式數據庫相比它有如下主要優點:可解決組織機構分散而數據需要相互聯系的問題;均衡負載—— 可避免臨界瓶頸;可靠性高——個別場地發生故障,不致引起整個系統的癱瘓;可擴充性好——可在對當 前機構影響最小的情況下進行擴充。

分布式數據庫中的核心問題就是如何來確定數據在計算機網絡中各個場地的分配方案,包括數據的分 布、分割和冗余設計。本系統中使用了水平分片和誘導分片相結合的分布方案,數據完整性通過表間關系 來限定,並通過在程序中捕獲異常來向用戶報告錯誤信息。

2、ADO.NET

分布式數據庫技術具有諸多優點,但同時也帶來新的問題,如:數據一致性問題、數據遠程傳遞的實 現、通信開銷的降低等,使得分布式數據庫系統的開發變得較為復雜。解決這些問題的一個理想方案就是 采用 .NET框架提供的ADO.NET數據訪問模型。ADO.NET通過使用樂觀一致性方案來控制數據一致性,能夠 在更少的時間內響應數量巨大的用戶。這兩種技術的結合相得益彰,大大簡化了開發分布式數據庫系統的 工作量和難度。

3、遠程對象的實現、發布和獲取

首先,在類庫中聲明一個派生自MarshalByRefObject 類的遠程對象類,其中定義了遠程調用所需的服 務,如:數據的查詢、表間的連接和合並等。利用ADO.NET 的強大功能可以輕松實現各種數據服務,尤其 它提供了對SQL SERVER的優化支持,如果底層數據庫使用SQL SERVER,將獲得比使用其他數據庫系統更好 的性能。然後通過動態鏈接庫技術將該遠程對象類封裝為一個 dll,然後分發到各個場地。

服務器端發布遠程對象時,首先要設置一個端口號,然後創建並注冊一個通道,最後發布該服務器端 的激活對象。其它場地的服務器根據IP地址和網絡端口號即可方便地獲取所發布的遠程對象。實現遠程對 象發布和獲取的關鍵代碼如下:

遠程對象的發布:

TcpChannel chan = new TcpChannel(8888);
ChannelServices.RegisterChannel (chan);
RemotingConfiguration.RegisterWellKnownServiceType(typeof (DbServerLibrary.DbServer),"DbServer",
WellKnownObjectMode.Singleton); //以Singleton模式 發布該服務器端激活對象

遠程對象的獲取:

dbServer = (DbServerLibrary.DbServer)Activator.GetObject(typeof (DbServerLibrary.DbServer),
"tcp://219.224.xx.xx:8888/DbServer");

4、應用程序的部署

實現遠程對象後,可以采用多種方式進行應用程序的部署,比如,可以將每個服務器端的遠程對象程 序集(DbServerLibrary.dll)部署到客戶端應用程序,為增強安全性也可以通過部署元數據程序集或接 口數據集來達到同樣的實現。本系統實現時,采用了部署元數據程序集的方式,並進行了以下模擬:同樣 一台機器通過使用不同的數據庫文件,來分別模擬一台服務器和本地客戶端。這樣,在兩台機器上就可以 測試本系統。

系統啟動後,首先將各個場地的服務器應用程序啟動,通過注冊的端口接收客戶端發來的請求。客戶 端在獲取用戶查詢請求後,首先通過SQL命令解析模塊,並查詢數據字典,將命令進行分解和重組,然後 初始化遠程對象的代理,將命令分配被相應的遠程對象代理,調用遠程對象的方法,並將結果集返回,最 後在界面上顯示結果集,從而完成用戶請求。

總結

分布式應用程序以其高度的可擴展性和可伸縮性,同時由於資源共享提高了系統的性價比,已經得到 廣泛的研究和應用,各種分布式計算對象和平台也得到了延伸和拓展。.NET Remoting 是.NET框架提供的 一項強大的技術,利用它可以使位於任何位置的應用程序互相通信,這些應用程序可能運行在同一台計算 機上,或者局域網內的不同計算機上,也可能位於相隔萬裡的有巨大差異的網絡中。

使用.NET Remoting技術結合ADO.NET能夠高效、可靠地建立分布式數據應用程序的解決方案。其優勢 在於:通過使用. NET Remoting框架能夠方便地解決數據、命令遠程傳遞問題;而通過ADO. NET 對數據 庫可以方便地進行操作,使分布式數據庫系統中對數據庫的各種操作更加高效、可靠,同時易於解決數據 的完整性和一致性問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved