.NET Remoting构建分布式数据库查询
引言
隨著傳統的數據庫、計算機網絡和數字通信技術的快速發展,以數據分布存儲和分布處理為主要特征的分布式數據庫系統的研究和開發越來越受到人們的關注。微軟提供了兩種解決方案來為用戶實現數據服務,即 .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 對數據庫可以方便地進行操作,使分布式數據庫系統中對數據庫的各種操作更加高效、可靠,同時易于解決數據的完整性和一致性問題。
轉載于:https://www.cnblogs.com/tommyli/archive/2008/03/11/1099942.html
總結
以上是生活随笔為你收集整理的.NET Remoting构建分布式数据库查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是动态语言(转)
- 下一篇: [导入]使用RDLC报表(一)