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