让Delphi的DataSnap发挥最大效率

简介: 让Delphi的DataSnap发挥最大效率 一个DataSnap的应用程序由两个层组成:DataSnap服务器,它有一个带有一个或者更多DataSetProvider组件的远程数据模块;DataSnap客户端,它带有一个xxxConnection组件和一个或者多个连接到DataSetProviders的ClientDataSets。

让Delphi的DataSnap发挥最大效率

一个DataSnap的应用程序由两个层组成:

DataSnap服务器,它有一个带有一个或者更多DataSetProvider组件的远程数据模块;DataSnap客户端,它带有一个xxxConnection组件和一个或者多个连接到DataSetProviders的ClientDataSets。

 

你可以不使用ClientDataSet而换用XMLBroker组件,后者是专门用在InternetExpress Web服务器应用程序上的。 DataSetProviders的作用是把数据导出到外部世界,而ClientDataSets的功能是接收数据(并把请求和更新发送回DataSetProvider)。许多DataSnap客户端都可以连接到单个DataSnap服务器,向服务器请求数据,而服务器往往就是数据吞吐量瓶颈发生的地方。

 

让我们开始吧 让我们就从这个问题的解决开始,确认线路上发送数据的真实量是很有必要的。因此,我们不会去研究(请求和接收数据的)ClientDataSets,而是要研究一下DataSetProvider组件——它会回应数据请求从而发送数据。

 

幸运的是,DataSetProvider组件有一些有用的虚拟方法,它们能够被用来强制替代(别的方法)以及包含我们的“追踪”代码,这样你就能够了解数据吞吐的真实情况。 一旦了解了情况,你就可以开始着手降低吞吐量了。当然,你不能因为能够优化就开始进行优化;总得有个原因。但是一旦有几百个客户端连接到你的DataSnap服务器,所有客户端都会请求成兆的数据,你就要因为这个原因而立即开始优化了。 DataSnap就是原来的MIDAS DataSnap技术是MIDAS的新名字,它在Delphi企业版里(或者C++Builder企业版里)被用来创建多层应用程序。当我谈到DataSnap的效率时,我主要关心的是数据吞吐量的瓶颈,包括限制从服务器层发送到客户层的数据量从而防止瓶颈的方法。在你能够限制吞吐量之前,你首先要测量它。

 

在本文的后半部分里,我会假设你有一个DataSnap服务器和客户端可用。如果你需要的话,可以在Delphi6DemosMidasMstrDtl获得一个DataSnap主从复合结构(master-detail)的示例项目。为了测量数据量,你把TdataSetProvider组件用一个叫做TB42DataSetProvider的专用版本替换掉。新的组件有一个BytesTransferred属性,它会包含自从其被创建以来被传送的字节数量。 它会强制替代InternalGetRecords方法,以增加FbytesTransferred里的值,并报告所传送的字节数量,还会报告新的数据包已经被发送,包括记录的数目以及数据包的大小。这两个方法(见Listing A)会被ClientDataSet或者XMLBroker组件调用,用以响应DataSnap客户端的数据请求。 要注意,eBob42PRO单元里的代码会使用InternalGetRecords和CreateDataPacket方法里的简单writeln声明。这就意味着你必须把{$APPTYPE CONSOLE}这一行添加到你DataSnap服务器的主项目里,这样才能为调式的输出打开一个控制台窗口。如果你忘了做这个,那也不用担心DataSnap服务器会向你报I/O错误了,因为IsConsole的检查会确保writeln声明只在控制台应用程序里被确实地调用。 要使用这个组件很简单:把TB42DataSetProvider组件添加到组件调色盘里的一个Delphi工具包里,并使用TB42DataSetProvider替换掉你远程数据模块上的普通TdataSetProvider。 ClientDataSet的PacketRecords 使用ClientDataSet连接到DataSetProvider(它指向整个表格)的潜在危险之一是:当你打开ClientDataSet的时候,它会缺省地从DataSetProvider请求所有的数据。这就意味着(服务器端)表格的全部内容都要通过线路送到ClientDataSet。对于Delphi自己的示例数据库表格当然是没有问题的,举个例子的话,因为消费者和订单的表格所包含的记录会少于100条。但是,在现实生活中,公司的消费者会多于100个(而订单的数量会更多),获取所有客户(的信息)会花上一段时间,在你每次打开ClientDataSet的时候把表格的内容从DataSnap服务器发送到DataSnap客户端也要花上一段时间。 解决这个问题的一种方法是使用ClientDataSet组件的PacketRecords属性。这个属性会对数据的初始请求进行修改,让其包含被请求数据包的大小(以记录的形式)。所以如果有上千条记录存在的话,你只用取得文件X,而文件X是PacketRecords属性的值。在缺省条件下,这个属性被设置为-1,即“把所有的记录都给我”。

相关文章
|
1月前
|
存储 监控 安全
推荐5款极具效率的实用工具软件
每次分享实用的软件,都会给人一种踏实和喜悦的感觉,这也是我热衷于搜集和推荐高效工具软件的原因。
31 1
|
1月前
|
存储 编译器 C++
嵌入式中C++ 编程习惯与编程要点分析
嵌入式中C++ 编程习惯与编程要点分析
18 1
|
6月前
|
缓存 安全 BI
|
7月前
|
算法 Java Shell
简化Java编程的法宝,让工作更高效
简化Java编程的法宝,让工作更高效
|
9月前
|
存储 机器学习/深度学习 自然语言处理
转:算法与程序设计在文档管理系统中的优势与场景应用
算法与程序设计在文档管理系统中具有许多优势,这些优势使得系统更高效、安全、智能,并提供更好的用户体验,使得用户可以更方便地管理和利用文档资源。
55 0
管理感悟:软件的特性
管理感悟:软件的特性
50 0
|
存储 设计模式 程序员
多数程序员难以简单的方式开发应用?
  心理学中有一篇相当古老、但又非常重要的论文,题为《魔法数字七(上下浮动二):人类信息处理能力中的一些限制》。这篇文章衡量了大脑处理信息的极限,并给出了一个具体的数字:人脑可以同时容纳五到九个概念。我们当然能够把这个有趣的结论延伸到诸多领域当中,但对软件开发人员而言,下面两项含义最为重要:
108 0
|
JSON JavaScript 数据可视化
提高效率,记一个内部工具的开发经历
提高效率,记一个内部工具的开发经历
167 0