让Delphi的DataSnap发挥最大效率

转载 2011年01月15日 09:29:00

一个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的效率时, 我主要关心的是数据吞吐量的瓶颈,包括限制从服务器层发送到客户层的数据量从而防止瓶颈的方法。在你能够限制吞吐量之前,你首先要测量它。

TB42DataSetProvider

在 本文的后半部分里,我会假设你有一个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,即“把所有的记录都给我”。

要获得记录的下一个数据包,DataSnap就要调用GetNextPacket方法,这样做将不仅获得下一个数据包,还会返回所取回记录的数量——所以检测到你什么时候会到达远程表格的末端以及已经取回了所有的记录并不难。

让Delphi的DataSnap发挥最大效率

一个DataSnap的应用程序由两个层组成:DataSnap服务器,它有一个带有一个或者更多DataSetProvider组件的远程数据模块;DataSnap客户端,它带有一个xxxConnectio...
  • gzxiaorou
  • gzxiaorou
  • 2015年03月22日 15:51
  • 2707

让Delphi的DataSnap发挥最大效率

 让Delphi的DataSnap发挥最大效率 一个DataSnap的应用程序由两个层组成:DataSnap服务器,它有一个带有一个或者更多DataSetProvider组件的远程数据模块;DataS...
  • chinahuyong
  • chinahuyong
  • 2009年03月26日 16:10
  • 1803

Delphi的DataSnap发挥最大效率

让Delphi的DataSnap发挥最大效率                            分类:            编程语言-Delphi2011-01-11 15:03443...
  • itkeyuan
  • itkeyuan
  • 2015年07月11日 00:29
  • 732

Delphi XE8中开发DataSnap程序常见问题和解决方法 (三)用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”

当我们在客户端用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”!! 问题原因:服务器端对提供服务的控件所属单元选择错...
  • sunylat
  • sunylat
  • 2015年06月11日 10:56
  • 5604

利用DataSnap的回调功能在客户端显示服务器方法的执行进度

DataSnap Callback 执行进度
  • ddqqyy
  • ddqqyy
  • 2011年02月11日 14:49
  • 5004

Delphi XE 10 跨平台三层数据库应用 datasnap

(1)生成DataSnap服务器的框架 初学者都是呆子,还是用向导吧,主菜单“File”->“New”->“Other…”得到“New Items”向导对话框。见图一。 图一、向导 ...
  • xiexuan2007
  • xiexuan2007
  • 2017年09月19日 18:26
  • 643

关于Delphi XE DataSnap心跳包

user Windows; private procedure ClientDisconnectEvent(Sender: TObject); // 客户端异常出错处理,需要引用windows单元 ...
  • zjluming
  • zjluming
  • 2014年02月15日 15:53
  • 2319

多层数据库应用基于Delphi DataSnap方法调用的实现(二)更新数据集

    传统的数据集的读取和更新,是通过中间层的TDataSetProvider来完成的。TDataSetProvider负责从它上游的数据集读取数据生成Data包,再传给客户端;另一方面,在客户端提...
  • ddqqyy
  • ddqqyy
  • 2011年02月08日 18:29
  • 9442

Delphi2010开发DataSnap服务器(一)

今天简单的研究了一下Delphi开发DataSnap服务器,以下是简单的例子,各位见笑了。 第一步创建一个DataSnap Server 这里选择默认 选择好了以后这里生成3个文件,我将...
  • qwe515800
  • qwe515800
  • 2016年12月04日 16:13
  • 620

Delphi2010中DataSnap技术网摘

作为一个服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。有了客户端IP就能随心所欲操控客户端,比如终止某些客户端的连接、限制功能等等。   在...
  • xieyunc
  • xieyunc
  • 2015年08月22日 22:20
  • 1040
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让Delphi的DataSnap发挥最大效率
举报原因:
原因补充:

(最多只允许输入30个字)