首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C# 實作分散式資料庫查詢:.NET Remoting + ADO.NET 架構詳解

     編輯:MySQL 資料庫相關知識

傳統分散式資料庫開發面臨跨節點通訊、資料一致性、異構整合等高複雜度挑戰。本文展示在 .NET Framework 環境下,結合 **C#**、**.NET Remoting** 遠端呼叫框架與 **ADO.NET** 離線資料集模型,快速構建支援本地/遠端/聯合查詢的分散式查詢系統,大幅降低開發門檻。

系統架構:家電連鎖總部與分店

  • 總部:員工庫、總庫存庫、信用卡客戶庫、供應商庫 (固定 IP 伺服器)。
  • 各分店:銷售庫、庫存庫 (固定 IP 伺服器)。
  • 通訊:總部與分店、分店間透過 TCP/IP 連結。

分散式系統架構圖

核心技術棧

層次技術角色
遠端通訊.NET Remoting (TcpChannel)透明化跨進程/跨機器物件呼叫,隱藏 Socket/序列化細節
資料存取ADO.NET (SqlConnection, SqlDataAdapter, DataSet)離線資料集、XML 序列化、樂觀並發控制、DataTable 遠端傳遞
業務邏輯C# 類別庫封裝查詢、建表、Join、Merge 等可重用服務

關鍵實作細節

1. 遠端物件發佈與取得 (伺服器端/用戶端)

// 伺服器端:發佈 DbServer 為 Singleton WellKnown 物件
TcpChannel channel = new TcpChannel(int.Parse(port));
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(DbServer), "STORE", WellKnownObjectMode.Singleton);

// 用戶端:依 IP:Port 取得透明 Proxy
try {
    myDbServer = (DbServer)Activator.GetObject(
        typeof(DbServer), "tcp://" + ip + ":" + port + "/STORE");
} catch (RemotingException ex) { /* 物件定義不符 */ }
catch (NullReferenceException ex) { /* URL 不可達 */ }

2. ADO.NET 離線資料存取模式

string connStr = "Initial Catalog=Store;Data Source=localhost;User ID=sa;Password=;";
using (SqlConnection conn = new SqlConnection(connStr)) {
    conn.Open();
    DataSet ds = new DataSet();
    DataTable dt = new DataTable("Result");
    SqlDataAdapter adapter = new SqlDataAdapter(cmdText, conn);
    adapter.Fill(dt); // 將結果填入 DataTable (離線、可序列化)
    ds.Tables.Add(dt);
    return ds; // DataSet 可直接跨 Remoting 傳回用戶端
}

優勢:DataSet 內建 Original/Current 版本 支援樂觀並發,更新時自動比對原始值偵測衝突,無需長時間鎖定資料庫資源。

3. 三類查詢模式實作

  • 本地查詢:直接連接本機 SQL Server,同單機應用。
  • 遠端查詢:取得遠端 DbServer Proxy,呼叫 Query(sql) 方法,透明執行。
  • 聯合查詢 (最複雜):
    例:第 2 分店查詢第 3/4 分店「北京供應商的冷氣庫存」。
    步驟:
    1. 取得總部、第3、第4店 Proxy。
    2. 遠端在總部建暫存表 t1,存放北京供應商清單 (總部才有地址資訊)。
    3. 將 t1 複製至第3、第4店。
    4. 遠端執行 t1 JOIN 本地庫存表 產生 t2, t3。
    5. 將 t2, t3 取回本地,DataTable.Merge() 合併並 DataGrid 顯示。
    過程涉及跨節點 建表、資料複製、Join、Merge,皆封裝於 DbServer.dll 供調用。

一致性與可靠性保障

  • 樂觀並發:DataAdapter.Update() 時自動比對 Original 值,衝突拋 DBConcurrencyException。
  • 交易界限:跨節點交易建議使用 System.EnterpriseServices (COM+) 或 WCF 交易流,Remoting 本身不提供分散式交易協調器 (DTC) 整合。
  • 錯誤處理:Remoting 例外 (RemotingException, SocketException) 需區分網路暫時性錯誤與邏輯錯誤,實作重試與熔斷。

現代化遷移建議

.NET Remoting 為舊世代技術,**新專案請採用**:

  • ASP.NET Core Web API / gRPC:跨平台、高效能、契約優先、支援容器化。
  • Entity Framework Core / Dapper:現代 ORM/Micro-ORM,支援 LINQ、非同步、變更追蹤。
  • 分散式查詢引擎:Apache Calcite、Presto/Trino、或雲端資料虛擬化服務 (Azure Synapse, AWS Athena) 取代手工聯合查詢邏輯。

結語

C# + .NET Remoting + ADO.NET 在 2000 年代提供了極具生產力的分散式資料庫開發路徑,其核心思想——**遠端透明呼叫 + 離線資料集傳遞 + 樂觀並發**——仍具架構參考價值。理解此演進脈絡,有助於在現代微服務與雲原生架構中做出更合理的技術選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved