随笔分类 -  delphi datasnap 中间件

上一页 1 ··· 4 5 6 7 8 9 10 下一页
delphi datasnap 中间件
摘要:任意对象若想要序列化,他无限分解后,只会剩下:基础数据类型(int、string、DateTime等)和数组,而其余的,皆为浮云。强大的功能的背后总是性能的牺牲。为了支持一切对象,不得不再次牺牲序列化的大小,在每一个集合的元素前都写入其类型。在牺牲序列化后的大小,得到的是——任意对象的复制!在我们总在讨论为了跨平台而使用XML、JSON。。。。。。序列化的时候,请记住,其实我们有种最最原始的方式,那就是结构体和拼字节的序列化方式也是可以跨平台的。而且这种原始的武器真的很简单很强大。至于通讯,简单的SOCKET编程你会吗? 阅读全文
posted @ 2013-07-13 15:26 delphi中间件 阅读(1085) 评论(0) 推荐(0) 编辑
摘要:SOA 是一种程序设计思想,其实早在远古时代(计算机史)它就已经出现了。无非就是把系统分解,将数据和业务逻辑部分尽量独立出来,然后以服务形式提供给另外的系统共用。那时也有一些可以实现 SOA 的工具,比如 DCOM、CORBA 等,不过前者仅限于 Windows,后者又太复杂,而且也仅对 C/C++、Delphi、Java 这等语言有较好支持,而且也都是商业开发软件中才会包含,对于开源的脚本类语言来说支持很差甚至没有支持(因为太复杂了,不是什么人都可以实现的了的,能够把整个 CORBA 规范完整读下来,都需要很好的耐心,还不一定都能够完全理解)。之后互联网发展了,XML-RPC 出现了,XML 阅读全文
posted @ 2013-07-13 15:24 delphi中间件 阅读(1026) 评论(0) 推荐(0) 编辑
摘要:群里有位同仁提出他有一个DATASNAP远程方法超过了32个参数,然后DELPHI编译通不过,提示方法参数不能超过32个,问怎么办?于是群内同仁纷纷出主意,我说用OLEVARINAT数组,有人说用RECORD,我又说别说用RECORD,连自定义的类也是可以的。于是我想到了实现,用SUPEROBJECT序列RECORD或者CLASS为JSON的字符串挺方便的,中间件收到客户端传来的JSON字符串再还原为RECORD或者CLASS。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, C 阅读全文
posted @ 2013-07-09 11:27 delphi中间件 阅读(2168) 评论(0) 推荐(0) 编辑
摘要:如果客户端是TCP/IP是短连接的情况就没有必要了。type pClientConns = ^TClientConns; // 客户连接 TClientConns = record clientid: integer; ip: string; port: string; logintime: TDateTime; end;type G_ClientConnects: TDictionary<TIdTCPConnection, pClientConns>; // 客户端连接字典procedure TServerContainer1.DSTCPServerT... 阅读全文
posted @ 2013-03-07 09:47 delphi中间件 阅读(3640) 评论(1) 推荐(0) 编辑
摘要://////////////////////////////////////////////////////////////////////////////////功能: STRING 的内容流化到 OLEVARIANT 中//参数:////////////////////////////////////////////////////////////////////////////////function TextToOleData(const AText: string): OleVariant;varnSize: Integer;pData: Pointer;beginnSize := 阅读全文
posted @ 2013-02-27 11:04 delphi中间件 阅读(8302) 评论(0) 推荐(0) 编辑
摘要:现在,DATASNAP倾向于使用JSON作为统一的数据序列格式,以期达到跨平台的效果。于是使用JSON便成为热点。unit uJSONDB;interface uses SysUtils, Classes, Variants, DB, DBClient, SuperObject, Dialogs; type TJSONDB = class private class function getJsonFieldNames(res: ISuperObject):TStringList ; class function getJsonFieldValues... 阅读全文
posted @ 2013-02-20 22:56 delphi中间件 阅读(6752) 评论(0) 推荐(2) 编辑
摘要:OleVariant的本质OleVariant,COM的一种数据类型。MIDAS基于COM之上构建的,自然使用OleVariant作为数据序列格式。延续到现在最新的DATASNAP仍然支持它。TClientDataset.data,TClientDataset.delta,这俩个属性的类型都是OleVariant。OleVariant可以是string,integer,float...这个大家都知道,但它也可以是array of OleVariant,这个可能有人不知道了。明白了这点就是datasnap中间件主从表数据同步的关键。var a: TServerMethods1Client; .. 阅读全文
posted @ 2013-01-30 11:49 delphi中间件 阅读(7920) 评论(0) 推荐(0) 编辑
摘要:DATASNAP中间件使用巢状对象提交数据非常方便,巢状对象会自动生成更新的SQL语句,无需我们手工拼写,只需类似如下的一行代码即可搞定。dm.dspQuery.ApplyUpdates(v, 0, ErrCount);但是,有时候却会报错。一种原因是数据表结构设计时使用了数据库保留的字段名引起的。比如SQL SERVER数据库如果某表结构使用status的字段名,因为status是SQL SERVER的保留字。而巢状对象自动生成的SQL语句不会用[status]把status包起来,导致sql server保留字错误。如何解决?设计数据表结构的时候,字段名要避免使用数据库的保留字。二种原因是 阅读全文
posted @ 2013-01-30 11:40 delphi中间件 阅读(807) 评论(0) 推荐(0) 编辑
摘要:最近做了个断网收银的项目,服务端使用SQL SERVER数据库,收银机使用ACCESS数据库。做了个中间件来同步数据。哪些数据需要同步?新增的数据修改过的数据删除的数据(删除只是置删除标志位,可以视为修改过的数据进行处理)需要同步的数据表统一预留俩个用于数据同步的字段:字段名:CreateDate,数据类型:TDateTime,新增数据的时间戳;字段名:ModifyDate,数据类型:TDateTime,修改过的数据的时间戳。倘若需要同步的数据表内的数据小,可以不使用时间戳,而在每次同步数据之前,先删除表内的所有数据,然后再插入同步的数据。如此编程最为简单,但必须是同步数据较小的情况下。数据同 阅读全文
posted @ 2013-01-30 11:17 delphi中间件 阅读(2200) 评论(1) 推荐(0) 编辑
摘要:如果通讯协议使用TCP/IP,客户端同中间件之间的SOCKET连接是非常有讲究的。应该视应用场合巧妙地使用短连接搭配长连接的方式。纯粹地使用长连接或者纯粹地使用短连接,往往不大合理。如果长时间让一个SOCKET长连接休闲,这无疑是对中间件资源的浪费,如果这种休闲的长连接数量非常多,可能会影响中间件的性能。光靠中间件通过发心跳包自动断开长时间休闲的连接,其实这是中间件对此类事件的最后一道防线。如果远程方程都做成短连接,也不大好,例如一些远程方法成块地执行,如果执行一个远程方法先同中间件建立SOCKET连接,执行完以后立即断开连接,这样就不好。因为建立SOCKET连接比较地耗时,一些远程方法成块地 阅读全文
posted @ 2013-01-10 21:08 delphi中间件 阅读(3816) 评论(1) 推荐(0) 编辑
摘要:procedure TFrmMain.btnUpdateFilesClick(Sender: TObject);begin try if Assigned(gEXEmm) then FreeAndNil(gEXEmm); if Assigned(gINImm) then FreeAndNil(gIN 阅读全文
posted @ 2012-12-29 22:24 delphi中间件 阅读(798) 评论(0) 推荐(0) 编辑
摘要:DataSnap可以直接传递和返回TStream类型的参数,这点是很方便的。但是很多人发现好像大小稍微大点就工作不正常了。DataSnap默认的缓存大小是32k 所以如果流的大小超过这个大小就会被自动分成多个包,这就是传递大量数据的基础,如果一次性发送就可能受到内存的限制。当传递大量数据时获取到的大小是-1,所以如果还是按照一般的方法来读取流的数据就会有问题了。由于流的数据是原始数据包发送,所以在不对数据包压缩加密的情况下,传递速度是和其它方式没有多大区别的。0102030405060708091011121314151617181920212223// FS是一个文件流function TM 阅读全文
posted @ 2012-11-23 21:48 delphi中间件 阅读(2137) 评论(0) 推荐(1) 编辑
摘要:1.字串统一使用WIDESTRING类型2.客户端调用适配器DLL时,参数传DELTA,不要传TCLIENTDATASET 阅读全文
posted @ 2012-09-11 16:03 delphi中间件 阅读(859) 评论(1) 推荐(0) 编辑
摘要:客户端可以是D5~XE2任意版本的DELPHI来写。非常适合老系统升级。 阅读全文
posted @ 2012-09-07 17:59 delphi中间件 阅读(1159) 评论(3) 推荐(0) 编辑
摘要:xe2 DATASNAP出来一年了。相信许多人同我一样领略它开发中间层的快捷(相对老的MIDAS确实简便了许多)。但苦于自己有许多的老系统是用DELPHI7甚至DELPHI6开发的,想用XE2开发的中间层升级,却不成。直接的话,它们确实是不兼容。还是那句话,既然直接的不行,咱就来间接的。使用桥接模式,正好可以解决问题。至少,我试过了,可以。思路是:使用XE2开发一个动态库,这个动态库负责SOCKET连接中间层,还有参数类型转换(主要是ANSISTRING和UNICODESTRING的问题),在这个桥接的动态库,这些全部都解决了。我测试的时候DELPHI7调用XE2 DATASNAP的中间层跑得 阅读全文
posted @ 2012-08-24 14:49 delphi中间件 阅读(1234) 评论(3) 推荐(0) 编辑
摘要:1.TCP/IP心跳包,XE2 DATASNAP本身已内置,设置几个属性就可以,这个经过了测试。不再需要像DELPHI 2010 DATASNAP那样要自己写代码来处理。2.XE2 DATASNAP内置的线程池是使用的INDY10的线程池。INDY10是阻塞+多线程的通讯控件。实际测试当中发现DATASNAP是一个客户连接对应一个线程,一直到客户连接断开线程才归还线程池中,就算一个客户连接以后啥事也不干,也要一直地占用服务端一个线程对象。有多少个连接客户,服务端就要开启多少个线程。如果客户数量比较多的话,这样是很没有效率的。开启的线程较多,CPU的时间都花在线程的上下文切换上面。所以在大量并发 阅读全文
posted @ 2012-06-21 15:14 delphi中间件 阅读(5422) 评论(1) 推荐(1) 编辑
摘要:uses Datasnap.DSIntf设置ZLIB压缩等级(zcFastest表示最快的压缩速度) ZCompressStream(M, M0, zcFastest);获取压缩前和压缩后的数据包的体积 iTest := DataPacketSize(VarToDataPacket(aDsp[i].Data)); iB := GetTickCount; v[i] := CompressData(aDsp[i].Data); iTime := GetTickCount - iB; ShowMessage(IntToStr(iTime)); iTest := DataPacketSize(VarT 阅读全文
posted @ 2012-04-06 14:30 delphi中间件 阅读(1758) 评论(0) 推荐(0) 编辑
摘要:1. 安装SQL SERVER 2008 R2 NATIVE CLIENT, 注意区分CPU是32位还是64位的2. COPY XE2的MIDAS到C:\WINDOWS\SYSTEM32\, 低版本的MIDAS.DLL会报错: invalid package3. 命令行执行 REGSVR32 MIDAS.DLL 注册MIDAS, 必须是XE2的MIDAS.DLL4. 安装所必须的文件: dbxmss.dll, sqlncli10.dll, midas.dll, config.ini, server.exe5. midas.dll,倘若uses midaslib单元,发布时可以省却。6. 数据引 阅读全文
posted @ 2012-03-13 18:04 delphi中间件 阅读(1041) 评论(0) 推荐(0) 编辑
摘要:使用OLEVARIANT可以序列任何类型的对象。下面的代码序列TDATASET。procedure TForm1.DatasetToVariant(var varResultSet: OleVariant; ADataset : TDataset);var m : Integer; nRecords, nColumns, nCurRec : Integer;begin nRecords := -1; nColumns := -1; try { Create the array... } nColumns := Max(0, ADataset.FieldCount-1); nRecords := 阅读全文
posted @ 2012-03-09 20:29 delphi中间件 阅读(1373) 评论(2) 推荐(0) 编辑
摘要:上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句。相对于直接调用datasetprovider.applyupdates()方法提交数据而言,前者的可控性更强,对于某些要求灵活性很强的场合,前者可能是必须的提交方式。procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);var Flag: Boolean;begin if VarIsNull(Delta 阅读全文
posted @ 2012-03-09 20:19 delphi中间件 阅读(5496) 评论(6) 推荐(0) 编辑

上一页 1 ··· 4 5 6 7 8 9 10 下一页
点击右上角即可分享
微信分享提示