首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 多層分布式開發實戰(一):MIDAS/DataSnap 架構原理與基礎 COM 服務器/客戶端構建

     編輯:Delphi

多層架構演進與核心價值

傳統兩層 (Client-Server):客戶端直連數據庫,邏輯分散、部署維護難、連接數昂貴、安全性弱。
MIDAS (Multi-tier Distributed Application Services) / DataSnap (Delphi 6+) 引入 應用程序服務器 (中間層):

  • 客戶端極瘦:僅 EXE + MIDAS.DLL (或 dsnap.dll),無數據庫驅動、無 SQL 邏輯。
  • 業務邏輯集中:封裝在服務端 COM 組件 (Remote Data Module) 中,多客戶端共享、統一升級。
  • 通信標準:DCOM (局域網)、TCP/IP (Socket)、HTTP/SOAP (Web)、CORBA (異構)。
  • 連接池化:服務端管理數據庫連接,客戶端無長連接,大幅降低授權成本。
  • 安全隔離:數據庫不直接暴露外網,服務端實現字段級權限、行級過濾。

前置準備

  1. 服務端機器:安裝數據庫客戶端、BDE/ADO/DBX 驅動,註冊系統 DSN/別名。
  2. 客戶端機器:複製服務端 Windows\System32\MIDAS.DLL (或 dsnap.dll) 到客戶端目錄或系統目錄,**必不可少**。
  3. Delphi IDE:File → New → Other → Multitier → Remote Data Module。

服務端構建:Remote Data Module (COM 組件)

1. 創建向導設置

  • CoClass Name:MyAppServer (客戶端通過此名連接)。
  • Instancing:Multiple Instance (推薦,每客戶端一實例,資源均衡、故障隔離)。Single Instance 單進程串行,高併發性能差。
  • Threading Model:Apartment (推薦,每實例單線程,VCL 非線程安全組件安全)。Free/Both 需自行處理線程同步。

2. 組件佈局 (設計時)

  • 數據訪問組件:TADOTable / TSQLTable / TTable (按數據庫類型選擇)。
  • 設置連接:ConnectionString / DatabaseName / SQLConnection。
  • 關鍵:放置 TDataSetProvider (DataSnap 頁),DataSetProvider1.DataSet := ADOTable1。
  • 無需對每個數據集組件做 Export,DataSetProvider 自動暴露其數據包接口。

3. 編譯、註冊、運行

編譯 DLL/EXE 即自動在本機註冊 (註冊表 HKCR\CLSID\{GUID})。可用 regsvr32 手動註冊。運行 EXE 形式服務器便於調試 (控制台輸出)。

客戶端構建:瘦客戶端

1. 組件佈局

  • TDCOMConnection (DataSnap 頁):ServerName := 'MyAppServer.MyAppServer' (ProgID),Connected := True。
  • 網絡部署時:ComputerName := 'ServerIP或機器名',GUID 自動解析。
  • TClientDataSet (Data Access 頁):RemoteServer := DCOMConnection1,ProviderName := 'DataSetProvider1',Active := True。
  • TDataSource.DataSet := ClientDataSet1,綁定 TDBGrid、TDBNavigator 等數據感知控件。

2. 核心特性:離線數據包與批量更新

  • ClientDataSet 在本地內存緩存數據包 (Delta),支持導航、篩選、索引、聚合、**無需服務端交互**。
  • 修改後調用 ClientDataSet.ApplyUpdates(-1) 將變更包發送服務端,由 DataSetProvider 解析應用到數據庫 (事務保護)。
  • 衝突處理:OnReconcileError 事件處理並發衝突。

3. ActionList 快速構建工具欄

// 標準 Action: DataSetFirst, DataSetPrior, DataSetNext, DataSetLast
// DataSetInsert, DataSetDelete, DataSetEdit, DataSetPost, DataSetCancel
// DataSetRefresh
// 自定義 Action: ApplyUpdates, ExitApp

procedure TForm1.ApplyUpdatesExecute(Sender: TObject);
begin
  ClientDataSet1.ApplyUpdates(-1);
  ShowMessage('數據已成功寫入數據庫!');
end;

procedure TForm1.ExitAppExecute(Sender: TObject);
begin Close; end;

通信協議選擇 (DataSnap 擴展)

客戶端代碼幾乎無需修改,只需替換 RemoteServer 組件類型並設置對應連接參數。

常見部署問題排查

  1. 「類未註冊」:客戶端機器未註冊服務端 COM 組件 (需管理員運行 regsvr32 Server.dll),或 ProGID 拼寫錯誤。
  2. DCOM 權限:dcomcnfg → 組件屬性 → 安全性 → 啟動/激活/訪問權限添加 Everyone 或特定用戶組。
  3. MIDAS.DLL 版本不匹配:客戶端必須使用與服務端編譯版本一致的 MIDAS.DLL (Delphi 版本對應)。
  4. 防火牆阻攔 135/動態端口:DCOM 需開放 RPC 端口範圍,或改用 HTTP 通道。

總結

MIDAS/DataSnap 以 Remote Data Module (COM) + DataSetProvider + ClientDataSet 為核心三角,構建了經典的 Delphi 多層架構。本篇完成了基礎服務器/客戶端構建、離線數據包操作、批量更新、多通道通信選型。下篇將深入 SQL 直通、動態數據源切換、主從表關聯等進階實戰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
協議組件適用場景
DCOMTDCOMConnectionWindows 域環境、高性能、雙向回調
TCP/IP (Socket)TSocketConnection跨平台、防火牆友好、需自建服務端監聽程序
HTTP/HTTPS (Web)TWebConnection / THTTPRIOInternet、穿透防火牆、Web 服務集成、支援 SOAP/JSON
CORBATCorbaConnection異構系統集成 (Java/C++ 服務端)