分布式多層數據庫開發簡介
Delphi提出的MIDAS(Multi-Tier distributed Application Services Suite多層分布式應用服務器組),是把原來Two- Tier數據連接放到了服務器端 的COM組件上,客戶端只剩下了執行文件和MIDAS.DLL,前台和服務器上的COM組 件,通過DCOM機制互相溝通。
這個多的一層,稱為應用程序服務器(Application Server),或者稱為中 間件。這種多層分布式工作機制,主要基於這樣幾點考慮:
1) 減少客戶機的維護量,因為前台程序比較簡單;
把企業邏輯封裝在通用的中間件應用服務器中,不同的客戶都可以共享同一 個中間層(包括Web),而不必每個客戶都單獨實現企業規則,避免了重復開發 和維護的麻煩。由於客戶程序相當瘦(這就是現在流行的瘦客戶機概念),無論 是開發還是發布,都變得簡單了。
2) 便於升級,當中間件升級的時候,客戶程序可能不需要變化;
3) 實現了分布式數據處理,把一個應用程序分布在幾台機器上運行,可以 提高應用程序的性能,也可以把敏感部分封裝在中間件,為不同的用戶設置不同 的訪問權限,增強了安全性。
4) 減少直接連接數據庫的用戶數目,減少費用。
在Delphi 6.0上,在原來的MIDAS基礎上,發展了DataSnap技術,在很多細節 方面,它提供了原來MIDAS所沒有的許多功能,使用上更加方便了。
DataSnap主要提供客戶端和中間件之間的通信,不但支持COM+技術也支持 TCP/IP或者CORBA,它們使用類似的界面和方法,其結果由程序自動完成,這就 大大擴充了它的應用范圍。
下面我們通過幾個例子來說明多層數據庫的設計問題。
主要想解決這樣幾個問題:如何建立一個簡單的分布式系統,如何使用SQL, 如何傳遞附加信息和向客戶提供服務器方法,如何建立主從表結構。理解了這些 方法,我們就可以建立屬於自己的性能更加高超的數據庫系統來。
這些實例,我們不但要會做,更要理解。
必須要提醒的是,前台機器上除了應用程序以外,還必須把一個MIDAS.DLL文 件復值到前台機器上,這個文件在服務器的WINNT\System32目錄下。
服務器端程序
服務器端程序實際上是個COM 工程,它本身連接數據源,再通過接口與客戶 端聯系,這個COM 工程必須注冊在服務器上。
首先建立一個空白的工程。
file -> New -> Other -> Multitier -> Remote Data Module(遠程數據模塊)
對話框: Coclass Name : COM程序的名稱,前台依據這個名字查找COM程序 (Pct121) Instancing :執行模式,大部分用Multiple Instance(多重實例)
Threading Model:線程模式,建議用Apartment(單元)
下面我們就會對這幾個選擇詳加說明。
OK,產生一個窗口,在這個窗口裡,可以放入數據控件。
在Viwe -> Type Libray 中,我們可以看到這個COM 的一些特性。我們也 可以記下系統提供的GUID,以備後來使用。
加入一個ADOTable,並設置其指向一個數據庫。
再設置一個DataSetProvider(在DataAccess頁)指向ADOTable
這就完成了服務器端的程序設計。保存,編譯,注冊(注意,只要運行就自 動在本機注冊了)。
這裡需要做幾個說明:
1) 在客戶端,數據控件一般要和Datasource相連,但在服務器端,主要要 考慮數據和接口相連,Delphi 5.0以上版本規定,使用DataSetProvider
就不需要再針對每個控件做Export(導出)操作,而是由應用程序服務器自 動幫前台查找這就簡化了程序和維護量。但是,前台每個DataSet 必須有個
對應的DataSetProvider 才行。
2)關於建立COM 時的幾個選項現在說明一下:
A) Instancing :
Multiple Instance: 一個應用程序可以被多個前台程序調用使用,啟動和執 行的效率比較高,不耗費服務器太多的資源,管理上也比較方便。
Single Instance: 一個應用程序只能被一個前台程序調用,由於沒有排隊問 題,所以當某個查詢崩潰時,不會影響其它的查詢,但是,一個前台調用必然在 服務器上建立一個應用程序服務器的Process (進程),占用資源比較多,影響 服務器整體執行效率。
Internal: 建立一個In-Process的COM 程序(也就是DLL文件的格式),由 於Mult-Tier 結構中,應用程序服務器和前台程序是放在不同的地方的,兩台機 器的兩個程序就無法共享同一個Process,所以很少設置成Internal模式的。
B) Threading Model:
Apartment: 每個實例一次只能處理一個前台發出的Request(請求),如果 同時建立多個In-Process COM 程序,那每個COM 程序就會有一個現程服務,所 以數據是安全的,當然要注意某些共享變量的沖突。
Single: 單線程,循環工作,不會出現多任務的問題。
Free : 可以讓Remote Data Module自己處理多線程問題,客
戶端程序需要用多線程方法來處理。
Both : 和Free幾乎相同,但對應前台界面的Callback都是連
續的。
如果注冊後無法確認是否注冊成功,可以用C:\WINNT\Regedit.exe檢查。
客戶端程序
在Two-Tier模式中,客戶端(Client)程序是直接和服務器的數據源相連的, 而Multi-Tier模式,多個客戶端連接的是一個應用程序服務器,因為收費是按客 戶端數計算的,所以,數據庫的使用費用比較低。
下面的例子只提供了數據庫操作的最基本的功能,主要說明數據源的連接方 法。
1)建立一個普通的工程。
2)放置一個TDCOMConnrction控件(在Datasnap頁),屬性:
在本機注冊時,可直接設置以下屬性:
ServerName:應用程序服務器注冊名(pro1.pc121)
Connected=true 激活
這時你可以看到服務器端的COM 程序被激活了。
如果在網絡上調試,需要給出服務器名:
ComputerName:服務器名(自動給出網上鄰居)
注意:
ServerGUID的GUID值是自動給出的。
3)放置一個TClientDataSet控件(在Data Access頁)
屬性:
Name=cdsCustomer(重新起名)
RemoteServer= DCOMConnrction1
ProviderName:=DataSetProvider1(服務器端將被激活)
Active=true (激活後將能正常連接)
4)放置TDataSource,屬性:
Dataset:指向cdsCustomer。
其余猶如普通的數據庫設計。我們也可以練習一下TActionList控件的使用, 先做一個小練習:先用普通的方法連上數據庫,並用表格顯示:
放一個Toolbar加入四個按鈕。然後把Standard--àActionList加入進去。
在ActionList上右鍵,選:Action List Editor
多層數據庫中的一個例子在“客戶端-2”中。其中寫入和退出在Standard Action 內找不到,需要自己編,在ToolBar1內再加入兩個Button,寫:
procedure TForm1.ApplyUpdateExecute(Sender: TObject);
begin
cdsCustomer.ApplyUpdates(-1);
ShowMessage('已經正確地寫入數據庫中!!');
end;
procedure TForm1.CloseActionExecute(Sender: TObject);
begin
Close;
end;
下面裝飾這個Button組,調入一個ImageList1,調入相應的圖形:
ToolBar1的屬性Image=ImageList1
ShowHint=true
把每個Button的Hint的屬性放入適當的值。只要服務器端正確的注冊,這個 程序使用是沒有問題的。