关于 DataSnap

【活跃】[深圳]自在(1634421739) 0:04:57

这几天以一个简单项目结合开源数据库MySQL实测了一下

DataSnap Server 及 Multi-Device DataSnap Client

的基本功能与性能,感觉还是非常不错的。整个测试过程消除了之前我对DataSnap的一些错误认识,尤其是对移动设备如何通过DataSnap中间件访问企业数据库(MySQL)的一些细节。在我的测试中,特意为了避开REST以及WebBroker技术,原因是XE的DataSnap技术框架一直在优化,而到了XE7仍然保留了单独的DataSnap Server模型。(总共有三种:

DataSnap Server、

DataSnap REST Application、

DataSnap WebBroker Application)。

之前网友们曾笑话我这样的做法有违三层开发的原则,不过我想这是因为大家没有深入讨论的原因。在我的测试中,采用的第一种模型即DataSnap Server,

数据传输走的仍然是轻量级交换格式:JSON。只是协议不是REST而已。对某些观点而言,我稍显过份的做法是在Server端自定义了一个方法:
function TDSServerModule_TEST.ChangeSQLString(Value: string): integer;
begin
  SQLDataSet_TEST.Active := False;
  SQLDataSet_TEST.CommandText := Value;
  SQLDataSet_TEST.Active := True;
  Result := SQLDataSet_TEST.RecordCount;
end;
而在客户端则引用服务端Proxy出的方法:
function TDSServerModule_TESTClient.ChangeSQLString(Value: string): Integer;
begin
  if FChangeSQLStringCommand = nil then
  begin
    FChangeSQLStringCommand := FDBXConnection.CreateCommand;
    FChangeSQLStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
    FChangeSQLStringCommand.Text := ‘TDSServerModule_TEST.ChangeSQLString‘;
    FChangeSQLStringCommand.Prepare;
  end;
  FChangeSQLStringCommand.Parameters[0].Value.SetWideString(Value);
  FChangeSQLStringCommand.ExecuteUpdate;
  Result := FChangeSQLStringCommand.Parameters[1].Value.GetInt32;
end;
这样做的好处是开发人员可以完全不再理解REST协议以及JSON数据格式(虽然实际通讯数据包仍然是JSON),在移动客户端并无实际的SQL Client,有的只是DataSnap Client(也就是SQLConnection的Driver属性为DataSnap)即可访问到最终的企业数据库了。
有人担心这样的方式并发连接以及事务处理会混乱,但实际来看,DataSnap既然推出这样的模型,早已经考虑到这些问题了。我的实际应用并发连接测试中并未发生不稳定或数据出错的现象。

当然可以把ChangeSQLString这个方法更优化一些,加一个参数,即可让双方的通讯不仅支持SQL Query,还可以支持存储过程调用了。

这样移动客户端的数据请求是非常方便的,例如:
TheSQLString := ‘select * from tableA where ID>‘ + Edit1.text;
try
  aclient := TDSServerModule_TESTClient.Create(SQLConnection1.DBXConnection);
  aclient.ChangeSQLString(TheSQLString);
  aclient.Free;
  ClientDataSet1.Close;
  ClientDataSet1.Open;
except
  showmessage(‘系统出错,请检查网络连接或重新运行程序。‘);
  SQLConnection1.Close;
  SQLConnection1.Open;
end;

当然,诚如网友们提出的非常明显的缺陷,这样的三层架构全部都得由Delphi XE来实现,并不兼容其它语言。而如果中间件做成REST/JSON Application,那就不同了。

在整个测试过程中,发现要支持移动端的稍显复杂的需求,LiveBinding基本上成了废物(无论DBExpress还是FireDAC)。原因是它压根就没能为移动端提供Query及存储过程等特性的支持。

实际稍复杂的移动端应用场景,LiveBinding这玩意用处不大。

我测试了两种模式:

  1. VCL Form Server Application
  2. VCL Win32 Service Application,

    未能测试64位的原因是没有找到libmysql.dll的64位驱动。就32位而言,实测过程很稳定。

时间: 2024-10-17 08:45:54

关于 DataSnap的相关文章

解决DataSnap支持的Tcp长连接数受限的两种方法

如何解决DataSnap支持的Tcp长连接数受限的问题? 方案一: 采用代理服务器方式,基本流程为: 1.客户先连接代理服务器:2.获取可用的服务器IP和端口:3.关闭与代理服务器之间的连接:4.建立与可用服务器之间的连接.而且在第2步中可以实现负载均衡的配置与实现.博主最近对一个机房管理系统升级采用的就是此方案,学校(某一高新)公共机房现有机房50间左右,每间机房60台机器(标准配置),现有客户端3000台左右,以后肯定还要扩容更新的,故以5000个客户端为正常容量.因为要实时检测学生的的状态

datasnap rest Windows客户端编写

首先吐槽一下XE关于datasnap的资料真的是太少了... 服务端用DSHTTPService1控件可以实现http接口方式的调用,返回的都是json格式数据,适用于跨平台解析. 这里着重强调一下datasnap http方式默认为Get方式调用,如果用Post方式的话需要在TServerMethods1单元方法前加update,好无语的方式.. 用Get方式这里说一下如果接口有参数的情况下,传递格式为 接口名/参数1/参数2/……,比如:http://127.0.0.1:8080/datas

用事件的方式实现DataSnap服务器的接口授权

我们只要实现DSAuthenticationManager1的OnuserAuthenticate和OnUserAuthorize事件,就可以对接口调用进行控制,事件如下: procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRol

论DATASNAP中间件对象池

在此,笔者以DATASNAP为例,其它中间件以此类推. 中间件为什么要使用对象池? 对象池——让所有的对象免堕轮回之苦,对象不再为其生和死而烦恼. 要想让中间件长久稳定地运行,做到无人值守,对象池很重要,对象池大致分为以下几类. 1)线程池,DATASNAP使用INDY10作为其通讯控件,其线程池实际上就是使用INDY10的,只是DATASNAP在其基础上再封装了一层壳罢了,留给我们的只需要设置相关控件的属性即可,在些不多说: 2)服务对象池,DATASNAP向导会生成一个ServerMetho

DataSnap下的分包获取

DataSnap下通过TQuery—TDataSetProvider—TClientDataSet获取数据,如果是主从数据,则每条主表记录都会触发从表数据的获取. 这种获取和组织数据的方式有一个问题:如果主表纪录有数千条,则会导致从表SQL语句运行数千次,从效率和性能上讲是不合理的.所以在很多情况下,对主从表可以考虑采用分包获取的方式,即一次性获取主表数据,但是不获取从表数据,当需要显示或编辑从表数据时,再获取该主表纪录对应的从表数据.要实现这个功能,按照帮助说明要求,需要调整TDataSetP

又是DataSnap的问题

最近在调试DataSnap的程序,突然发现TClientDataSet打不开了,报错为dsnap200.bpl的非法地址访问,如下图: 很是怪异,干脆新建工程,只有TSQLConnection.TSQLQuery.TDataSetProvider和TClientDataSet,如下图: 开ClientDataSet1的时候还是报上面的错误,运行期也报非法地址访问错误.开始还以为系统遭了,于是把6月份重整系统的C盘重新恢复了,但问题依旧,有点蒙了.后来在工程文件中加入Midaslib,将DataS

如何创建一个DataSnap Server

第一步:新建一个DataSnap Server 应用程序 第二步:选择伺服形态 第三步:

DataSnap Server

建立DataSnap/REST服务器,请点选Files|New菜单,在DataSnap Server选项中选择DataSnap Server图像,如下图所示: 服务器可以创建exe,app,也可以是服务:可以是windows 平台,也可以是firemonkey跨平台. 一路完成后会生成控件 TDSServer,TDSTCPServerTransport以及TDSServerClass.TDSHTTPService y

datasnap——动态注册服务类

datasnap——动态注册服务类 在DataSnap的应用程序时,我们首先需要注册的服务器类,以提供访问客户端应用程序的服务器方法.通常的做法是使用DSServerClass组件,但有些时候,我们要做到在运行时加载.下面代码实现的类TSimpleServerClass从TDSServerClass继承,超载了Create方法并且增加了ServerClass,DataSnap Server和LifeCycle三个参数. type TSimpleServerClass = class(TDSSer

DataSnap服务端的接口认证

在服务端只要实现DSAuthenticationManager1组件的OnuserAuthenticate事件,我们就可以完成客户端接入接口的认证,他的事件如下: procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRoles: T