让Delphi的DataSnap发挥最大效率
让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,即“把所有的记录都给我”。
让Delphi的DataSnap发挥最大效率的更多相关文章
- java android 访问DELPHI 的DATASNAP
最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...
- Delphi 使用 Datasnap 的几种三层应用技术总结
Delphi 使用 Datasnap 进行三层应用开发,积累了几种技术,总结如下: 1.(推荐!)在 Datasnap 服务端 使用 TDatasetProvider,客户端 使用 TDSProv ...
- delphi XE Datasnap SERVER 在windows 7 下为服务添加描述信息
网上对服务添加描述信息的,多数是用注册表的方式,而注册表的方式,我在win7 下测试,不知为什么,总是不行,把执行的CMD以管理员模式开启,还是没加进去. 于是在网上查到下面的代码,保存供叁考,原文博 ...
- Delphi 中DataSnap技术网摘
Delphi2010中DataSnap技术网摘 一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7 ...
- delphi 各版本的特性
delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面: IDE(整合开发环境) Internet XML(扩展标记语言) Compiler( ...
- 第三章 传奇的开始--Delphi(附读书笔记)
第三章 传奇的开始--Delphi "是惊世之作的Delphi让Borland重新站了起来,没有当初的Delphi,就没有今日的Borland!" "是Turbo Pas ...
- Delphi XE 10 跨平台三层数据库应用教程
Delphi XE 10 跨平台三层数据库应用教程 前言: Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高.最容易上手的,其快速设计RAD ...
- delphi 数据库技术沉浮录--谨给成为历史的BDE
2014年9月,delphi xe7 出来了,这次在数据库技术方面,彻底抛掉了从1995 年 delphi 1.0 就自带的(Borland Database Engine)数据库访问技术.从而宣告了 ...
- 使用http.sys,让delphi 的多层服务飞起来
核心提示:一直以来,delphi 的网络通讯层都是以indy 为主,虽然indy 的功能非常多,涉及到网络服务的各个方面,但是对于大多数多层服务来说,就是需要一个快速.稳定.高效的传输层.Delphi ...
随机推荐
- 【CodeForces 471A】MUH and Sticks
题 题意 给你六根木棍的长度,熊需要头比身体短,大象需要头和身体一样,四肢要一样长,否则就是外星人.请你判断能组成哪一个. 分析 暴力,循环看一下每根有几根相同的,然后如果有四根都是有四根相同的&am ...
- NOI题库--图论 宗教信仰
1526:宗教信仰 总时间限制: 5000ms 内存限制: 65536kB 描述 世界上有许多宗教,你感兴趣的是你学校里的同学信仰多少种宗教. 你的学校有n名学生(0 < n <= 500 ...
- maven运行javaWeb项目
首先从svn下载下来的maven项目,需要点击项目,然后import--->Existing Maven Projects->全选之后点next就转换成功了,然后 run as--> ...
- hihocoder1187 Divisors
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given an integer n, for all integers not larger than n, f ...
- udp内网穿透 两个内网互联
1,在有外网ip的机器上启动server. package udp; import java.net.DatagramPacket; import java.net.InetSocketAddress ...
- ExtJS入门教程02,form也可以很优雅
在上一篇<Extjs window 入门>中,我们已经看到了如何将一个form组件放到window中,今天我们来看看form的一些优雅的工作方式. 使用fieldDefaults,优雅的设 ...
- 使用存取方法来设置Property value
对比如下代码,第一种使用了存取方法来设置,第二种直接对实例变量操作.显然我们应该采用第一种, 使用第二种情况,简单的情况还好,如果情况一旦复杂,就非常容易出错.并且直接对实例变量操作,不会引发KVO通 ...
- SpringMVC 返回JSON数据
首先添加json包
- linux wget 命令用法详解(附实例说明)
Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器 Linux wget是一个下 ...
- centos6.4.yum-lamp环境设置
首先防火墙开启mysql:3306 apache 80 and 81端口: vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tc ...