RO10 – 不要频繁调用服务:通过最小调用改善执行
RemObjects
提示
:
虽然我们任务这篇文档是正确的
,
但是我们予以保证
.
这里感谢
Kevin
的大作
.
这篇文章讨论了创建高效灵活远程服务的重要设计原则
.
通常我们尽量减少客户端向远程服务请求次数
.
假设有一个集中部署的单据管理系统
,
远程办公室客户需要查看存储在服务器上的支票信息
.
服务器端已经存在叫做
BillingService
的
RemObjects
服务
.
现在只需要在服务上增加一个供客户端查看支票的方法
,
我们叫做
GetInvoice.
GetInvoice
方法接受一个支票编号参数返回给客户端一个支票结构体
.
方法定义在
BillingService_Impl.pas
文件中
,
声明如下
function
GetInvoice(InvoiceNo: string): Invoice;
这个思路很直接也很容易完成代码
,
你的远程用户输入支票号码
,
应用程序调用
BillingService.GetInvoice
方法
,
然后支票信息返回给客户端显示
.
这时
,
没有什么效率的问题
.
然而我们再增加一个需求
.
远程用户要求查看所以没有打印的发票列表
,
并可以从中选择一个或多个打印
.
有人认为这个需求很好实现
,
我们已经完成了一半了
.
你可能会定义一个新方法获取没有打印的发票列表
,
但是已经存在
GetInvoice
方法了
,
所以只要做一个打印功能即可
.
多谢
RemObjects
使我们的生活很美好
,
你可以忽略以前的函数从新创建一个方法返回所以没有打印的发票列表
.
新方法定义如下
function
GetUnprintedInvoices: string;
保持
strings
很简单
,GetUnprintInvoice
返回的多个发票号
,
我们可以用
TStringList
实例
:
MyStringList.Text := BillingService.GetUnprintedInvoices();
这个列表可以发送到客户端的
TListBox
控件显示
.
现在可以在最终端用户界面显示这个发票号码列表了
,
使用
GetInvoice
方法
,
得到用户从
ListBox
中选择的发票号码对应的信息
,
准备打印
.
虽然这个设计可以很好的运行
,
但是做一个微小的改动就可以显著的提高运行性能
.
现在设计的问题在于每个要的打印的发票都要使用
GetInvoice
方法从服务器端调用发票信息
,
每个调用都要去连接服务器
,
增加了远程服务器负担
.
打印几个发票时可能影响不大
,
但是当打印大量发票时
,
就会频繁的调用
GetInvoice
方法
.
解决方法就是减少调用远程服务器的次数
.
在发票打印范例中
,
无论多少发票需要打印我们都可以轻松的减少调用服务器的次
.
怎么做呢
?
通过一次调用返回所有要打印的发票信息
.
我们需要改善
GetInvoice
方法获取发票号码列表并向调用者返回发票集合
(
结构体
).
原来方法:
function
GetInvoice(InvoiceNo: string): Invoice;
新方法:
function
GetInvoices(InvoiceNoList: string): arrInvoices;
现在我们可以使用简单的
TStringList
保持发票号码列表
,
使用其
Text
属性给
InvoiceNoList
参数赋值
.
我们使用
RO Server Builder
创建新的
GetInvoices
方法返回一个发票结构体列表
.
这时使用一个调用就可以取得全部要打印的发票结构体列表
.
我们修改了方法让我们可以一次返回一个或多个发票信息
,
同样我们也可以修改开始时要求显示发票信息的方法
.
这个改进提高了多少效率
?
本文在使用
RemObjects
时写的
,
通过改进设计执行效率提升了
50
倍
!
总之
,
重复调用
RemObjects
服务器要比一次调用大数据包代价高
.
Kevin Powick
是
Trident Information Systems(
开发数据库应用和信息管理系统的软件公司
,
成立与
1992
年
) .