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
做为消息调用的返回值返回给客户端。
下面时读取数据的活动图