一、Datasnap與多層數據應用 Datasnap是集成在delphi7中的一項數據訪問技術,在Delphi5以前它被稱為MIDAS(Multi -tier Distributed Application Services Suite),即多層分布式應用服務套件。 Datasnap是用來開發多層應用系統的透明中介引擎。通過Datasnap可以使用相同的組件存 取不同的后端應用程序服務器,而且它是跨平台的,無論在Windows還是其他操作系統上都 可以使用。 1. 分布式應用系統結構 在傳統的兩層C/S模式應用系統中,客戶端應用程序直接訪問后端數據庫服務器,這存在很 大的弊端: 一是當連接到數據庫服務器的客戶應用程序過多時,數據庫服務器的執行效率會降低; 二是由於數據庫服務器的限制,整個系統的應用被限制在某一個固定的區域中工作,例如 一個局域網。 三是企業邏輯和商業規則往往被寫死在客戶端應用程序中,或者通過存儲過程等手段寫在 數據庫當中,而這兩種方法都有各自的缺點。 如果所有的邏輯和規則都寫在客戶端應用程序中,一旦這些邏輯發生變化,就要修改所有 的客戶端應用,這個弊端在我們先前的應用中已經有所表現。 如果邏輯和規則寫死在服務器端的數據庫中,則由於要執行大量的企業邏輯,這會大幅降 低數據庫服務器的工作效率,而且會影響系統的通用性和移植性。 如果考慮Web應用,現在的數據庫都支持Web應用的訪問,但都不直接提供Web服務,而是需 要編寫Web服務代碼通過Web服務器如IIS間接的訪問數據庫,企業邏輯和規則被寫入到這些 代碼中,如ASP代碼。一旦企業邏輯和規則變更,則需要同時修改Web服務代碼。 通常的C/S結構,在這種結構中,對遠程用戶而言,Web服務器是server端,而在局域網內部,它和其他普通 局域網用戶一樣的訪問數據庫服務器,所以它們除了權限之外大部分的邏輯應用是非常相 似的,而他們采用的語言和代碼卻是完全不一樣的。 如果把這些相同的邏輯提取出來,加上權限等控制信息,就成為了簡單的多層應用系統。
在這種情況下,大部分的控制和應用邏輯都集中到中間應用層,普通客戶端和Web服務 器只需要負責與用戶的界面交互,並將交互反應給應用服務器即可。因為傳統的技術和We b應用均可以直接訪問應用服務器,所以可以避免大量的重復性開發和維護工作。 在加入了中間應用服務器之后的結構中,數據服務器的性能依然可以得到很好的利用 ,例如集中式的數據存儲,主從結構的多表修改等都可以通過數據服務器的存儲過程來實 現。但這並不表示所有的企業邏輯和商業規則都可以通過存儲過程實現,如復雜的多表計 算、非精確數據表示等。 2. 分布式多級體系的優勢 多級系統和普通C/S系統相比存在以下主要優勢: (1)在多級系統結構中,由於應用服務器集中實現了企業邏輯和商業規則,客戶程序只需 要將重點放在數據顯示和與用戶交互上,數據庫的存儲和內部結構對客戶端而言已經無關 緊要。對數據庫修改更新的代價大大減少。 (2)由於普通技術和Web技術均可以訪問應用服務器,所以不需要維護兩套幾乎完全重復 但語言不同的代碼,避免重復開發和維護的麻煩。另外由於Datasnap直接支持Socket和TC P/IP連接,所以甚至可以將客戶端直接用於遠程連接,而避免不同的Web瀏覽器帶來的顯示 和使用麻煩。 (3)大量的企業邏輯和商業規則封裝在中間應用服務器之后,客戶端就可以做的很瘦,客 戶端程序的發布、安裝、配置和維護將更加簡單。從這個角度講,多層體系同時具備 了B /S和C/S的優點,因為中間應用服務器充當了雙重的角色。 (4)極大的可擴充性。由於Datasnap實現了分布式處理和負載平衡功能,不同的應用功能 可以做成不同的中間服務器,而多個應用服務器既可以訪問同一個數據庫又可以訪問不同 數據庫甚至不同機器上的數據庫,因為不管是中間服務器還是數據庫服務器在哪對客戶端 而言並不重要。由於負載平衡和分布式結構,一台服務器的停止不會使所有應用停止。 (5)增強了安全性。可以把敏感功能封裝在中間件中並提供不同的權限,同時又不至於使 用戶界面變得復雜。另外利用Server和client端的事件可以加入各種控制信息,如加密、 解密、壓縮、解壓等。 (6)Datasnap支持多種連接方式、支持多種分布式系統(DCOM、CORBA等),這些都封裝 了事務和安全服務,所以使用Datasnap技術構建多層分布式應用可以免去大量復雜和低級 代碼的編寫,諸如網絡訪問、事務管理等等。 二、使用Datasnap進行數據訪問 使用Datasnap不僅可以像普通數據庫應用程序一樣的訪問數據,而且可以保存數據為文件 、從其他數據集中獲取數據等。 1. 普通數據訪問 Datasnap的客戶端通過中間層服務器的DataSetProvider間接的訪問數據庫,DataSetProv ider可以通過任何可用的連接方式(包括ADO)從不同的數據庫服務器(包括Access)獲取 數據,而客戶端則不需要知道數據庫具體在哪,是什么格式,用什么連接,只需要將Remo teSever或ConnectionBroker設置為一個指向某一個可用服務器的連接,然后就可以從服務 器的IAppServer接口獲得可用的數據。如果服務器端不允許進行某些數據的訪問就可以直 接屏蔽,這些數據在客戶端將不可見。 客戶端與服務器端的數據是通過類型為Variant的Data數據包進行的,這種數據包已經經過 了壓縮,並加入了附加信息,任何類型的數據元素都可以通過Data傳送。 客戶端可以一次性獲取滿足要求的所有數據記錄,也可以分段式的獲取記錄,對於如圖片 等大型數據可以特別處理。 通過服務器端的接口,客戶端可以動態更改所需要的數據集,甚至更改數據庫的連接。對 數據的查詢和過濾 既可以在服務器端進行也可以在客戶端進行,但在服務器端被過濾掉的 數據將不會再傳送到客戶端。 已經傳送到客戶端的數據在下次讀取時不會再次創送,而是放在客戶端的緩存中。從服務 器的數據讀取是以Delta的形式進行的,當然,可以用函數刷新全部的記錄。無論是已經存 儲在客戶端的記錄還是未被應用到實際數據庫的改動都可以單獨呈現,並可以文件的方式 存儲在客戶端。(注意:慎用ClientDataSet的filename,如果存在,客戶端將會將此文件 作為緩存,下次啟動客戶端時將自動從此緩存讀取數據而不是從服務器讀取數據。) 使用ClientDataSet的CommandText可以執行類似於ADOCommand的數據庫更新操作,這種操 作可以返回數據集也可以不返回數據集。CommandText可以存放普通的SQL語句。這里 的S QL語句將會通過服務器端的對應數據集來執行,該數據集原有的SQL語句將被替換,所以應 當使用單獨的Query來執行這種任務。 因為服務器端的數據模塊是以線程的方式存在的,任何兩個客戶端的操作不會沖突。使用 pooling技術可以讓多個線程為多個客戶端所共享,並可以減少關閉和打開數據庫的次數。 在客戶端對數據的更新必須調用ApplyChanges才能將改動寫入到服務器中,寫入之后並不 重新讀取數據庫,而是采用將改動同時合並到客戶端原有數據的方法。 2. 多用戶事務處理 當多用戶同時連接到一個應用服務器對數據庫進行操作時,發生沖突是常見的。 注意:下面的情況不會發生沖突: 用戶A修改了記錄1,用戶B修改了記錄2,當它們應用修改時不會發生沖突,因為修改是以 Delta方式應用在服務器上的,而應用修改之后並不會重新讀取數據,所以此時A和B客戶端 的記錄1和記錄2顯示結果是不一樣的,分別是它們修改之后的記錄,此時如果A修改記錄2 就會發生錯誤。 當發生沖突時可能的解決方式如下: Skip,跳過,這將跳過發生沖突的記錄,而將沒有發生沖突的記錄應用到服務器上。被跳 過的記錄在該客戶端依然處於未被應用的狀態,除非成功應用該更新或撤銷更新(即置Ch anged Count為0),否則將無法從服務器刷新數據。 Cancel,取消,這將中止整個應用修改的過程,已經更改的記錄已經寫入到數據庫,未更 改的數據在客戶端維持原狀,但Changed Count變為0,可以進行刷新。 Merge,合並,這種方法將服務器端的數據看作好像沒有被修改過一樣,強行將修改加入到 數據庫中。但是當其他用戶刪除了某一條記錄之后,對這條記錄的修改只能作廢。 Refresh,刷新,這將丟棄發生沖突的修改操作,而讀取服務器端的這條記錄來替換它。其 他沒有發生沖突的所有修改仍將執行。該操作執行完畢后可以馬上刷新。 Abort,中止整個應用修改的過程,不管是有沖突的還是沒有沖突的,都不會被應用到服務 器,客戶端維持原狀,Change Count不為0,必須正確應用修改或撤銷之后才能更新數據。 Correct,修正。這個類型比較特別。它允許對發生沖突的記錄在處理沖突的過程中進行修 改,沖突處理完成之后,客戶端的相應記錄被替換為設置的值。其他沒有沖突的記錄正常 修改到服務器。 當處理不同的沖突情形時應當采用不同的處理方式,當無法決定采用哪一種方法時應當讓 用戶來決定。 3. 主從數據庫訪問 Datasnap可以將服務器端的Master / Detail 數據結構完整的映射到客戶端,從數據表在 客戶端呈現為主數據表的一個特殊字段,利用這種主從映射可以保證數據庫的完整性,而 對數據庫的修改也只需要執行對主數據表的應用修改方法。 主從數據結構的映射可以使用分級獲取的方法,如果采用分級讀取數據,主數據表讀取的 同時並不會馬上讀取從數據表,只有調用相關的方法才會從服務器端讀取數據。 主從結構映射對層次沒有限制,即可以構造多層的 Master / Detail數據結構。當主表的 游標移動時,從表將同時移動游標,而不需要手動的數據操作。但是多層的Master / Det ail結構會使主表的數據包過於龐大,會加大網絡負荷,而采用分級獲取數據的方法可以減 小數據包,同時,應盡量不要在客戶端和服務器之間傳送過多的“select * ……”類型的 數據集。 4. 本地數據訪問 利用ClientDataSet可以完成多種本地數據存儲和訪問方式。 第一種是使用ClientDataSet的Save to File 和Load from File方法,這種方法可以將客 戶端的數據保存為XML格式或CDS(Client Data Set)格式。如果設置了ClientDataSet的 File Name屬性,這兩個方法將會自動調用,同時所指定的文件將會成為本地緩存,因為文 件在客戶端程序退出后依然存在,所以這種方法可以用於脫機瀏覽。但是不利的是,上一 次沒有更新到服務器上的修改將依然存在,除非這些修改正確更新或者被取消,否則不能 從服務器刷新數據。 第二種方法是單向的,為了和其他傳統的連接方式相適應,可以把其他類型的數據集,如 BDE,ADO等,傳遞給ClientDataSet,這樣,ClientDataSet不僅可以訪問遠程服務器,而 且可以訪問本地數據庫。但是在同一個ClientDataSet中這兩種方式不能並存,即同一時間 ClientDataSet中的數據要么是本地的,要么是遠程的。 利用ClientDataSet的Data方法可以方便的與其他方式的連接保持兼容,甚至共存。 三、容錯、安全和負載平衡 容錯、安全和負載平衡是Datasnap封裝的技術,利用這些技術可以使多層分布式系統更加 穩健的運行。 1. 容錯和負載平衡 容錯能力,就是當一台應用服務器發生故障時,Datasnap技術可以找到另外一台功能相同 的應用服務器繼續為客戶端應用提供服務,也就是說,容錯技術使通過冗余來實現的。 實現容錯技術,需要有多台運行中間服務器的機器,這些機器上都運行着已經注冊過的應 用服務器。客戶端通過Object Broker來連接服務器,而不是直接通過Remote Server,通 過這種方式,Object Broker將根據網絡的實際情況選擇連接到哪一台服務器,如果客戶機 運行過程中原服務器出錯,Object Broker將會找到另一台服務器繼續服務。 但是這里有一個問題還沒有得到考證:多台服務器上的數據如何保持一致,是否是自動的 。 負載平衡技術實際上也是通過冗余來實現的,當有多個客戶端需要服務時,負載平衡就是 讓這些客戶端連接到不同的服務器上,以使各個服務器承受合適的負荷。 2. 安全性 Datasnap技術本身具有一定的安全性,如果需要對在網絡中傳輸的數據包進行額外加密、 解密,數據攔截技術可以為此提供幫助。 另外因為服務器端的連接仍然采用傳統連接方式,所有傳統連接支持的功能在多層數據系 統中仍然能夠得到很好的支持。