DTO模式和SessionFacade模式的應用
?
(
一
)
DTO模式
我們的系統中經常需要在客戶端和服務器之間傳遞批量數據
,
例如客戶端需要顯示一個托運協議單
,
那么客戶端就要向服務器請求這個托運協議單中的所有數據
(
如
ConsignDate,StartPort,SenderName
等等
)
、或者客戶端需要創建、修改或刪除一個托運協議單。所有這些都會造成巨大數量的數據在客戶端和服務器中間交換,這通常可以通過兩種方法解決:(1)使用一個有很多參數的函數調用,每個數據項都作為函數的一個參數。例如
:
CreateConsignBill(String aBillId, String,Date aConsignDate,String,Port StartPort,String SenderName,
……
)
UpdateConsignBill(String aBillId, String,Date aConsignDate,String,Port StartPort,String SenderName,
……
)
(2)客戶端使用許多細粒度調用與服務器交換數據。如下圖
第一種方式性能比較高,只要在一次網絡調用中就可以完成數據傳輸,但是缺點是函數參數太多,函數將迅速失去控制,每當一個參數需要去被增加或刪除,方法簽名需要改變。;第二種方法可以保證調用的清晰性,但是最大的缺點就是性能問題,一次簡單的讀取數據就會導致大量的網絡調用,每個對服務器的調用是一個網絡調用,
需要對返回值序列化和反序列化,當
ejb
服務器還要對每次網絡調用進行安全檢查,并且如果客戶端沒有使用
JTA
的客戶分界(
client-demarcated
)事務,每個方法調用可能實際上在它自己的分離的事務中執行。用這種形式執行多個網絡調用將導致嚴重的性能下降。
我們的解決方案是生成一個稱為數據傳送對象(
Data Transfer Object,DTO
)的普通
Java
類,它代表一些服務器端數據的快照
,
該對象在一個網絡調用中封裝了批量數據。
在一個分布式系統中可以把
DTO
用作讀取操作和更新操作。當一個客戶端需要更新服務器上的一些數據時,它能創建一個封裝所有服務器需要去更新的信息的
DTO,
并傳到服務器去處理,服務器讀取
DTO
中的數據,然后進行相應的處理。當一個客戶端需要服務器中的數據時,只要向服務器端發送一個消息,服務器將數據組裝成
DTO
,然后將此
DTO
做為消息調用的返回值返回給客戶端。
下面時讀取數據的活動圖