delphi datasnap 中间件

http://www.cnblogs.com/hnxxcxg/category/353141.html

摘要: 客户端每天从代理服务器获取一个有效的中间件的IP地址和端口号,客户端当天之内都连接此中间件。如果客户端连不上中间件,就重新从代理服务器获取另一个有效的中间件的IP地址和端口号。 每个中间件启动时都主动连接代理服务器,中间件每隔几秒钟发送心跳包给代理服务器。代理服务器维护一个有效中间件的列表,对于超时 阅读全文
posted @  2016-03-17 14:30咏南 delphi 阅读(173) | 评论 (0) 编辑
摘要: http://files.cnblogs.com/files/hnxxcxg/%E5%92%8F%E5%8D%97%E4%B8%AD%E9%97%B4%E4%BB%B6%E5%92%8C%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6.rar 阅读全文
posted @  2016-03-11 10:21咏南 delphi 阅读(151) | 评论 (0) 编辑
摘要: 遍历Delta.DataView.Rows,Delta.DataView.Rows是记录的行集,由行组成TFDDatSRow,即是一行记录的对象TFDDatSRow的方法:GetData(),SetData()获取一行一列的数值或设置一行一列的数值fdmemtable.delta直接提交给中间件,中... 阅读全文
posted @  2016-01-14 11:37咏南 delphi 阅读(221) | 评论 (0) 编辑
摘要: TDSTCPServerTransport 的FiltersTDSTCPServerTransport 的 Filter 属性,可以对传递的数据进行加密,压缩,再修改等,有 点注入的概念。默认情况下,Datasnap 自带的ZLIB, PC1,RSA 三个Filter。测试了一下, RSA 只对KE... 阅读全文
posted @  2016-01-06 15:42咏南 delphi 阅读(155) | 评论 (0) 编辑
摘要: ZLIBCOMPRESSION FILTER作为范例,我们使用已随D2010提供的DataSnap过滤器.可用于在客户端和服务端压缩数据流.这里说的ZlibCompression过滤器可以在DbxCompressionFilter单元找到.TDSTCPServer和TDSHTTPService组件都... 阅读全文
posted @  2016-01-06 11:44咏南 delphi 阅读(162) | 评论 (0) 编辑
摘要: 咏南CS插件开发框架同时支持2层和3层开发了,是的一套代码既支持2层也能3层开发。你要做的仅仅是在配置文件里面设置一个2层还是3层的开关控制一下。对,就这么简单! 阅读全文
posted @  2015-12-22 08:28咏南 delphi 阅读(336) | 评论 (0) 编辑
摘要: TFDStorageFormat = (sfAuto, sfXML, sfBinary, sfJSON);FIREDAC支持3种序列格式:XML,JSON和BIN。 阅读全文
posted @  2015-12-15 15:17咏南 delphi 阅读(195) | 评论 (0) 编辑
摘要: 1)FIREDAC数据库序列为字符串,进行了加压和BASE64编码function DataSetToString(const ADataSet: TFDAdaptedDataSet): string;var LBinary64: string; LMemoryStream: TMemorySt... 阅读全文
posted @  2015-12-15 14:59咏南 delphi 阅读(246) | 评论 (0) 编辑
摘要: 使用流做中转procedure CopyDataSet(const ASource, ADest: TFDAdaptedDataSet);var LStream: TStream;begin LStream := TMemoryStream.Create; try ASource.Sav... 阅读全文
posted @  2015-12-15 14:55咏南 delphi 阅读(112) | 评论 (0) 编辑
摘要: firedac数据集控件的公共祖先类——TFDAdaptedDataSetTFDQuery = class(TFDCustomQuery)TFDCustomQuery = class(TFDRdbmsDataSet)TFDRdbmsDataSet = class(TFDAdaptedDataSet)... 阅读全文
posted @  2015-12-15 14:41咏南 delphi 阅读(120) | 评论 (0) 编辑
摘要: 服务端:function TServerMethods1.spExecOut(funcId, sqlId, inParams: OleVariant): OleVariant;var d: TfrmDB; procName: string; params: TFDParams; i, h: ... 阅读全文
posted @  2015-11-01 17:01咏南 delphi 阅读(358) | 评论 (0) 编辑
摘要: 一般来将,连接在DB端有最大空闲时间的限制。如:mysql默认连接在8个小时无人使用(即有线程用Connection发送了SQL),就会自动断开。而此时,数据库连接池,却还不知道该连接已经被数据库断开了。这样问题就产生了,虽然从连接池中拿出了连接却在使用时,抛出连接已经被关闭的异常。unit unt... 阅读全文
posted @  2015-10-31 13:35咏南 delphi 阅读(339) | 评论 (0) 编辑
摘要: 1)中间件执行存储过程sp.Close; sp.StoredProcName := procName; sp.Prepare; // 生成存储过程的参数列表,无任何OUTPUT的存储过程,也会自动生成一个@ReturnValue的返回值参数 params := TFDP... 阅读全文
posted @  2015-10-28 14:49咏南 delphi 阅读(271) | 评论 (0) 编辑
摘要: SQLCONNECTION支持TCP/IP和HTTP两种通信协议和中间件连接。一般地,默认情况下使用TCP/IP协议。HTTP 协议的一个非常重要的优势在于穿越防火墙。SQLCONNECTION使用HTTP比TCP多了那么几个配置项。 with SQLConnection1 do begin Con... 阅读全文
posted @  2015-10-17 19:05咏南 delphi 阅读(308) | 评论 (0) 编辑
摘要: 所谓的“真3层”有时候是需要客户端上传数据集的TPARAMS到中间件的。现在,高版本的DATASNAP的远程方法其实也是直接可以传输TPARAMS类型的变量,但是DELPHI7(七爷)、六爷它们是不支持的。高版本的DATASNAP要让六爷、七爷它们调用,不能直接传TPARAMS,得转换。proced... 阅读全文
posted @  2015-10-17 18:28咏南 delphi 阅读(208) | 评论 (0) 编辑
摘要: {*******************************************************}{单元名: 日志版权:作者: 陈新光日期: 2015-10-17说明:更新历史:}{***************************************************... 阅读全文
posted @  2015-10-17 10:13咏南 delphi 阅读(161) | 评论 (0) 编辑
摘要: 购买了咏南多层开发框架的老用户如有需要提供免费升级。中间件 阅读全文
posted @  2015-09-07 22:46咏南 delphi 阅读(1031) | 评论 (0) 编辑
摘要: DATASNAP的中间件不仅支持WINDOWS客户端调用,也支持安卓手机,苹果手机客户端调用,当然也包括各种平板客户端调用。咏南DATASNAP中间件支持安卓手机客户端。测试环境:DELPHI XE8编译,手机系统是安卓5.1,界面使用FIREMONKEY。DELPHI编写手机客户端的注意事项:1)... 阅读全文
posted @  2015-08-09 13:09咏南 delphi 阅读(872) | 评论 (0) 编辑
摘要: 首先游戏服务器是分区的,客户端一般要选择登陆哪个区,登陆是通过网关服务器进行的,游戏的服务器可能多达上千台,如此众多的服务器是通过N个网关服务器组织而成集群,服务器当然是放“电信供应商”的机房了。WINDOWS游戏服务器IOCP无疑是首选。服务端和客户端一堆堆的缓存:TLIST、TSTRINGLIS... 阅读全文
posted @  2015-05-17 22:55咏南 delphi 阅读(377) | 评论 (0) 编辑
摘要: DELPHI开发2层C/S数据库应用程序,许多人通过ADOQUERY或ADOTABLE直接操作数据库,其实这种方法虽然最为直接,但有其缺点:如果以后要将程序升级为3层C/S会非常困难。而通过像下面的通用数据操作方法,像开发3层C/S一样地开发2层C/S程序,通过ADOQUERY或ADOTABLE获取... 阅读全文
posted @  2015-04-26 11:46咏南 delphi 阅读(1348) | 评论 (0) 编辑
摘要: 特大好消息:咏南C/S开发框架支持最新的DELPHI XE8开发!咏南开发框架让你再无开发工具升级后顾之忧!购买咏南开发框架送项目源码! 阅读全文
posted @  2015-04-18 23:01咏南 delphi 阅读(2124) | 评论 (0) 编辑
摘要: 购买咏南DATASNAP中间件送CS插件开发框架和BS开发框架,CS、BS开发框架共享同一个中间件。价格从优!中间件可供DELPHI6~DELPHI XE8开发的客户端调用!CS开发框架截图:BS开发框架截图: 阅读全文
posted @  2015-04-17 14:19咏南 delphi 阅读(2343) | 评论 (1) 编辑
摘要: 和咏南CS开发框架共享同一个咏南中间件。 阅读全文
posted @  2015-04-08 16:02咏南 delphi 阅读(1101) | 评论 (0) 编辑
摘要: EMS Package 向导:File > New > Other > Delphi projects > EMS > EMS PackageEmpty package. 不会在EMS Server注册资源 . 除非你稍后准备注册资源。Create package with resource. 创建... 阅读全文
posted @  2015-04-01 17:14咏南 delphi 阅读(353) | 评论 (0) 编辑
摘要: 自DELPHI XE7始提供企业移动服务,方便移动等设备通过REST+JSON访问中间件提供的服务。EMS (Enterprise Mobility Services企业移动服务)服务器给EMS客户端程序提供方法和服务。EMS服务是REST API服务器并且管理EMS数据库。The EMS Serv... 阅读全文
posted @  2015-04-01 16:51咏南 delphi 阅读(638) | 评论 (0) 编辑
摘要: 在此,笔者以DATASNAP为例,其它中间件以此类推。中间件为什么要使用对象池?对象池——让所有的对象免堕轮回之苦,对象不再为其生和死而烦恼。要想让中间件长久稳定地运行,做到无人值守,对象池很重要,对象池大致分为以下几类。1)线程池,DATASNAP使用INDY10作为其通讯控件,其线程池实际上就是... 阅读全文
posted @  2015-03-19 00:18咏南 delphi 阅读(1040) | 评论 (0) 编辑
posted @  2014-12-22 15:18咏南 delphi 阅读(818) | 评论 (0) 编辑
摘要: 企业ERP,往往有多个帐套,通常我们给每一个帐套对应地创建一个数据库,也就是说我们的中间件要同时能够连接多个帐套(数据库),这些帐套数据库甚至是属于不同类型的数据库。客户端请求数据的时候传递“帐套编号”即可以获取指定帐套的数据。对于一个用户来说,有可能只需要查询一个帐套里面的数据,但有的用户可能要能... 阅读全文
posted @  2014-12-06 23:04咏南 delphi 阅读(977) | 评论 (1) 编辑
摘要: mssql数据表中包含有自动增值字段khid,类型为identify(1,1),且为表的主关键字;在程序中修改和删除都没有问题,但增行时,增行总是提示错误'keyviolation'!如何取消这个提示呢?通过跟踪源代码,原来这个问题在于datasetprovider(tdatasetprovider... 阅读全文
posted @  2014-12-03 19:20咏南 delphi 阅读(666) | 评论 (0) 编辑
摘要: 咏南DATASNAP中间件提供免费使用了。百度网盘分享:链接: http://pan.baidu.com/s/1c06Ivp2 密码: dhhm 阅读全文
posted @  2014-12-03 15:11咏南 delphi 阅读(1721) | 评论 (0) 编辑
摘要: ERP系统的单据,总是些主从表结构,有一个主表,N个子表,子表又有子表,形成N层,单据数据提交时,主从表数据都要提交,为了保证数据的完整性,必须提供事务控制,要么都提交成功,有一个提交失败所有的提交都要回滚。看起来是有些难,但我们有OLEVARIANT数组可以利用,解决起来就简单了。上码。服务端:f... 阅读全文
posted @  2014-12-02 10:00咏南 delphi 阅读(1358) | 评论 (0) 编辑
摘要: 提供DELPHI中间件及中间件集群,有意请联系。N年前,我们用DELPHI低版本开发的两层程序(比如工厂ERP系统),现在仍然在企业广泛地得到使用,但老系统有些跟不上企业的发展需要了。主要表现在:虽然我们的老系统对企业的业务实现得很好,可以很好地满足企业目前的业务需求,但现在企业要求我们的服务器要能... 阅读全文
posted @  2014-12-01 07:46咏南 delphi 阅读(2748) | 评论 (1) 编辑
摘要: DATASNAP中间件:中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守;可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码;支持传统TCP/IP方式也支持REST;传统TCP/IP客户端支持长连接也支持短连接;数据库连接对象,中间件服务对象,数据集对象等对象全部采... 阅读全文
posted @  2014-11-19 15:34咏南 delphi 阅读(4718) | 评论 (4) 编辑
摘要: untFastReport.dfm文件:object frmFastReport: TfrmFastReport OldCreateOrder = False Height = 405 Width = 550 object report: TfrxReport Version = '4... 阅读全文
posted @  2014-11-18 11:48咏南 delphi 阅读(1834) | 评论 (0) 编辑
摘要: 1)服务端IIS网站上创建新的虚拟路径,给新创建的虚拟路径增加MIME类型:.bpl、.ini等。2)设置update.ini文件版本号配置文件[ver]config.ini=1bplCommon.bpl=1bplGoods.bpl=1bplPower.bpl=1bplPurchasing.bpl=... 阅读全文
posted @  2014-11-18 11:45咏南 delphi 阅读(1125) | 评论 (1) 编辑
摘要: function TServerMethods1.ExecuteSql(const sql: String): Boolean;var d: TfrmDB;begin d := DBPool.Lock; if Assigned(d) then begin try try ... 阅读全文
posted @  2014-10-25 18:14咏南 delphi 阅读(871) | 评论 (1) 编辑
摘要: 在好多群里面都碰到问“FIREDAC连接SQLITE乱码的”的问题的同仁,遂将解决方法贴出来:如上图所示设置 stringFormat为unicode即可 阅读全文
posted @  2014-10-09 10:47咏南 delphi 阅读(695) | 评论 (0) 编辑
摘要: OLEVARIANT——这个COM的序列格式,也是DATASNAP已使用了20年的序列格式,在20年以后的今天,终于有了它的替代者:FIREDAC的TFDJSONDataSets和TFDJSONDeltas,XE5 UPDATE2以上版本的DATASNAP的远程方法定义里面已经增加了这2种类型的支持... 阅读全文
posted @  2014-10-06 22:27咏南 delphi 阅读(2345) | 评论 (1) 编辑
摘要: 前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS。。。显然,DATASNAP的远程方法必须增加对FIREDAC数据集直接序列的参数类型。从XE5的UPDATE2开始增加一个新的单元文件:Data.F... 阅读全文
posted @  2014-10-06 01:02咏南 delphi 阅读(2762) | 评论 (2) 编辑
摘要: 快餐收银系统现向社会各界诚招代理商QQ:254072148QQ群:216077961BBS:http://qgc.qq.com/287858336EMAIL:254072148@qq.com支持WIN8 平板实现无线点菜收银 阅读全文
posted @  2014-09-17 14:55咏南 delphi 阅读(1568) | 评论 (2) 编辑
摘要: 你可以在客户端序列FireDAC数据集的DELTA , 将序列后的STREAM发送给中间件,中间件的TFDQuery或TFDMemTable调用LOADFROMSTREAM()方法加载流,然后调用ApplyUpdates()将数据保存进数据库中。怎样转换TFDQuery或TFDMemTable的De... 阅读全文
posted @  2014-09-16 10:54咏南 delphi 阅读(1872) | 评论 (1) 编辑
摘要: 服务端使用FDQUERY查询数据并返回TDATASET:function TServerMethods1.GetData(var sql: string): tdataset;begin qry.Close; qry.Open(sql); Result := TFDMemTable.Creat... 阅读全文
posted @  2014-09-15 22:15咏南 delphi 阅读(2557) | 评论 (2) 编辑
摘要: UniDac对Oracle的Direct连接,不需要套Oracle客户端dll,deploy时真的时 方便又快捷。FireDac连接Oracle,在没有Oracle Client的情况下,是可以连接上的。方式是前提:需要文件 oci.dll oraocci11.dll oraoci... 阅读全文
posted @  2014-09-12 17:27咏南 delphi 阅读(1558) | 评论 (1) 编辑
摘要: 随着XE6,XE7,以及半年以后即将发布的XE8,DATASNAP将顺应跨平台的需要,有可能的情况是这样的:XE8,DATASNAP写的中间件将可以运行在LINUX服务器上面。大家都知道COM是WINDOWS特有的东西,为了跨平台,COM将被弃用。DATASNAP残留的COM基因的东西统统将被弃用,... 阅读全文
posted @  2014-09-12 10:10咏南 delphi 阅读(5081) | 评论 (2) 编辑
摘要: unit GetBillNoObj;interfaceuses System.Classes, System.SysUtils, Data.FMTBcd, Data.DB, Winapi.Windows, Data.SqlExpr;Type TGetBillNoObj = class(TThr... 阅读全文
posted @  2014-09-05 10:45咏南 delphi 阅读(501) | 评论 (0) 编辑
摘要: 支持负载均衡集群的中间件主界面插件管理角色与权限用户与权限 阅读全文
posted @  2014-08-19 16:19咏南 delphi 阅读(855) | 评论 (2) 编辑
摘要: 提供DELPHI中间件和中间件集群,有意请联系。中间件集群的三种角色:客户端(简称C)、代理服务器(简称A)、中间件(简称M)。以下文字均使用简称。说明:C和M可能有多个,M在一台机器上可以开多个,多个M可以使用同一个IP地址,但必须绑定不同的端口号。中间件集群需要定义私有协议。M和A之间的交互协议... 阅读全文
posted @  2014-08-11 14:37咏南 delphi 阅读(839) | 评论 (0) 编辑
摘要: *集群可以布署在一台服务器上,也可以布署在多台服务器上;*支持传统TCP\IP协议;*既支持SOCKET长连接也支持短连接;*支持最新REST WEBSERVICE;*一台应用服务器可支持5000以上TCP\IP长连接,适用于大并发适时数据采集系统;*支持多帐套;*可实现应用服务器自由扩展,插件式的... 阅读全文
posted @  2014-08-07 17:58咏南 delphi 阅读(1061) | 评论 (0) 编辑
摘要: 快餐企业管理的目标是为了减少企业的营运成本:人力成本和物流成本。原材料统一采购,半成品统一加工、清洗。。。。。。菜品要做到统一的“标准菜谱”、“菜品标准配方”,每一个成品的菜品要经过哪几种“生产工艺”,每一个生产工艺包括哪几种“生产工序”,执行每一个生产工序需要耗费多少“工时”。能源成本的核算:每一... 阅读全文
posted @  2014-08-05 11:55咏南 delphi 阅读(314) | 评论 (0) 编辑
摘要: 对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据。大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000的数量(如果想要维持稳定运行的话)。原因是大家都晓得的,阻塞方式会为每一个SOCKET连接创建一个新的... 阅读全文
posted @  2014-08-04 09:39咏南 delphi 阅读(1650) | 评论 (3) 编辑
摘要: 默认情况下,一个线程的栈要预留1M的内存空间而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理... 阅读全文
posted @  2014-08-03 21:33咏南 delphi 阅读(412) | 评论 (0) 编辑
摘要: 传统的C/S管理软件将走向何方?基于互联网的平台化应该是个趋势。现在,网络无处不在,INTERNET无处不在。丰富的前端:PC机,移动设备。。。。。。产生客户必然的要求:不论何时、何地都要能使用管理软件,查看营业报表。。。。。。管理软件必须要符合这种时代的需要,才能生存。、至于程序是C/S还是B/S... 阅读全文
posted @  2014-07-26 16:59咏南 delphi 阅读(468) | 评论 (0) 编辑
摘要: 平台意味着整个系统可以持续扩展,不限定客户数量。如果可能,一切皆缓存,变直接操作数据为间接。所有客户的数据通过上传服务程序上传到平台服务器的指定目录中以文件的方式存储,平台服务器上跑一个程序自动将这些文件保存进数据库中。平台服务器上跑一个程序在客户停止营业的时段为所有的客户生成.html网页形式的报... 阅读全文
posted @  2014-07-26 16:53咏南 delphi 阅读(309) | 评论 (0) 编辑
摘要: 硬件永远比开发者和有效率的代码便宜。可能的话,缓存一切所有数据库都建立在SSD之上,这样可以获得0延时。尽可能最小化建立,程序可以工作才是重点。基于木桶效应,速度肯定受限于某个短板,现有的云服务基本上都存在容量和性能限制。达到同样的性能,使用云的成本将远远高于自建数据中心。什么好用用什么,不要做无必... 阅读全文
posted @  2014-07-26 15:35咏南 delphi 阅读(192) | 评论 (0) 编辑
posted @  2014-07-24 15:55咏南 delphi 阅读(234) | 评论 (0) 编辑
摘要: 通信协议制定以后也可能会修正,继而推出后续版本,这样就可能导致多个版本的通信协议存在。不同的客户端可能实现的是不同版本的通信协议。但服务端程序却只有一个,它如何同时支持客户端多个版本的通信协议?都能正确解析不同协议里面的数据?应该定义多个版本通信协议的数据封包格式,服务端按照不同的版本使用不同的数据... 阅读全文
posted @  2014-07-11 13:34咏南 delphi 阅读(221) | 评论 (0) 编辑
摘要: 提供DELPHI中间件及中间件集群。 阅读全文
posted @  2014-07-06 10:27咏南 delphi 阅读(442) | 评论 (0) 编辑
摘要: idhttp.get方式调用,这种比较简单,大家都会。post方式网上却没有任何成功的代码,本人也是摸索了一个上午才搞定。分享给大家。(1)post方式调用的远程方法,方法名必须加“update”前缀,不加行不?你试下啦。function TServerMethods1.updateecho(con... 阅读全文
posted @  2014-07-05 12:40咏南 delphi 阅读(1054) | 评论 (1) 编辑
摘要: 原来写的池子过于复杂,功能看似很全面,其实很没有效率可言,实际中也抵消掉了用池的效能方面的增长。拿原来的数据连接池来说吧,空闲的,占用的对象都在池中,对象一多,遍历的时候要判断是否空闲对象,其实是挺费时的。另外还有定时遍历池的机制,对象空闲超过预定时间的释放掉。在看了DATASNAP的线程池后,特别... 阅读全文
posted @  2014-07-05 09:49咏南 delphi 阅读(636) | 评论 (3) 编辑
摘要: 开发中间件的许多同仁,他们首先考虑的第一个问题就是中间件要能支持高并发。他们典型的口述:有一个项目,有3000个客户端,DATASNAP能不能支持这么多并发?3000个客户端并不代表就有3000个并发,打个比方,有一个叫做A群的QQ群,其成员数量上限是3000人,实际当中我们可以发现:(1)几乎没有... 阅读全文
posted @  2014-07-02 12:43咏南 delphi 阅读(543) | 评论 (0) 编辑
摘要: unit Unit1;interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, ... 阅读全文
posted @  2014-07-02 10:38咏南 delphi 阅读(1017) | 评论 (0) 编辑
摘要: unit Unit1;interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, ... 阅读全文
posted @  2014-06-19 12:02咏南 delphi 阅读(180) | 评论 (0) 编辑
该文被密码保护。
posted @  2014-06-19 10:19咏南 delphi 阅读(2) | 评论 (0) 编辑
该文被密码保护。
posted @  2014-06-17 17:21咏南 delphi 阅读(2) | 评论 (0) 编辑
该文被密码保护。
posted @  2014-06-17 17:20咏南 delphi 阅读(0) | 评论 (0) 编辑
该文被密码保护。
posted @  2014-06-17 17:15咏南 delphi 阅读(2) | 评论 (0) 编辑
摘要: 简约而不简单。世间万物本来很简单,只是人想得多了便越变越复杂了。万象,只不过是简单和复杂之分。是简单好还是复杂好?不同的人的回答是不一样的。从大多数人对现代社会的体验来看,人生中还是应多学会些简单。学会简单,就要多些本色回归。不追逐华而不实。丰足而不奢华,惬意而不张扬,还原事物的本色。简单本身就是一... 阅读全文
posted @  2014-06-08 11:20咏南 delphi 阅读(269) | 评论 (0) 编辑
摘要: 以前使用过BDE、ADO、DBX等数据引擎,后来发现它们都没有UNIDAC好用,所以在很长的一段时间内中间件都使用UNIDAC作为数据引擎。偶然的机会,使用了DELPHI XE5自带的FIREDAC数据引擎,在开发了几个项目以后发现它完全可以同UNIDAC相媲美,但UNIDAC购买费用是几万美刀,而... 阅读全文
posted @  2014-06-03 19:40咏南 delphi 阅读(2795) | 评论 (1) 编辑
摘要: 传统的做法,一个分布式业务系统就有一个中间件,一个中间件需要使用至少一个固定公网IP,这样的话,多个业务系统就需要使用多个固定公网IP。大家知道,固定公网IP价格可是不菲的。能不能让多个分布式业务系统共享使用一个固定公网IP?答案是肯定的:能。多个分布式的业务系统共享一个中间件,这个中间件供各分布式... 阅读全文
posted @  2014-05-24 15:42咏南 delphi 阅读(583) | 评论 (0) 编辑
摘要: 软件系统如何如何,老板最后来看的是报表。要想看不同的统计指标,就需要看不同的报表,这是通常的做法,于是乎几十个。。。。。。几百个报表,软件公司得投入多少的人力物力用于报表开发,有人说不是有报表开发平台吗?哎,有了它,你就不用做报表模板了吗?还得做。举个例子:销售类报表,一般地可能有几十个吧,能不能把... 阅读全文
posted @  2014-05-24 15:28咏南 delphi 阅读(462) | 评论 (0) 编辑
摘要: 二进制文件(也叫类型文件),二进制文件是由一批同一类型的数据组成的一个数据序列,就是说一个具体的二进制文件只能存放同一种类型的数据。type TMember = record Name : string[10]; eMail : string[20]; Posts : L... 阅读全文
posted @  2014-04-26 16:58咏南 delphi 阅读(379) | 评论 (0) 编辑
posted @  2014-04-02 10:12咏南 delphi 阅读(320) | 评论 (0) 编辑
posted @  2014-03-28 15:18咏南 delphi 阅读(925) | 评论 (0) 编辑
摘要: 1系统登录2收银主界面3交接班4报表5菜品更新 阅读全文
posted @  2014-03-24 17:29咏南 delphi 阅读(418) | 评论 (1) 编辑
摘要: unit untDBPool;interfaceuses Classes, SyncObjs, SysUtils, DateUtils, untDB, Windows, UntThreadTimer;const cMinNum = 10; // 池最多保留10个对象 cMaxNum = 10... 阅读全文
posted @  2014-03-23 21:50咏南 delphi 阅读(550) | 评论 (0) 编辑
摘要: datasnap多层框架在客户端要生成调用远程方法的接口,一个可以鼠标右键点选sqlconnection控件,然后选“generate datasnap client...”,就会自动生成一个所有远程方法的接口单元,这种方法完全不需要我们自己来写代码,超级省事。但也有不好的地方,一个是首先sqlconnection必需要连接上中间件(设置好一些属性后,静态连接),二个是凡中间件有的远程方法一股脑都给你生成了(都让人给看见了)。下面的方法通过自己写代码来声明远程方法调用,避免了前面的两点不足,缺点当然是要自己写代码了。function TRemoteMethods.GetSearchSQLDat 阅读全文
posted @  2014-03-04 15:20咏南 delphi 阅读(770) | 评论 (0) 编辑
摘要: 适用于快餐、烟酒行、网吧、快餐、精品店、烘焙店、酒店等行业的触摸收银系统。已经成功实施了多家快餐店。收银速度巨快。 阅读全文
posted @  2013-12-27 19:34咏南 delphi 阅读(515) | 评论 (2) 编辑
摘要: 冬至特赋诗二首以志之首一空门不肯出,逛街也太痴。百年钻PC,何日出头时。首二冬至寻花春觅冰,浪人正愁火车票。南来大雁北归燕,年初背井年尾还。首二之萧月禾兄改篇冬至寻花春觅冰,一票难求浪人急。南雁北归思乡切,年初背井年尾回。 阅读全文
posted @  2013-12-21 09:34咏南 delphi 阅读(143) | 评论 (0) 编辑
摘要: 在SQLServer2005以前的版本中,SQL分布式管理对象(SQL-DMO)为我们提供了非常有效的方法来通过编程的方式管理SQLServer。SQL-DMO支持基于COM的接口,开发人员可以通过这个接口来发现和操作SQLServer对象。而SQLServer2005在这方面做了更大的改进,它提供了一种新的管理框架,叫做SQLServer管理对象(简称为SMO),这套组件具有更强大的管理能力,而且它被建立在.NetFramework2.0之上。当然,我们仍然可以使用SQL-DMO来管理SQLServer2005,但SMO为我们提供了更多的功能,也支持很多SQLServer2005的新特性,它 阅读全文
posted @  2013-12-15 09:15咏南 delphi 阅读(722) | 评论 (1) 编辑
摘要: 该集群方案要求中间件主动连接代理服务器,也就是说中间件是代理服务器的客户端。这样做的好处是中间件可维护一个持久化连接到代理服务器,避免SOCKET连接设立时的开销,另外一个就是中间件可随意进行启动和停止而无需通知代理服务器。因此对中间件进行扩充时只需要启动新的中间件即可。中间件每隔几秒钟会发送心跳包给代理服务器。 阅读全文
posted @  2013-12-08 09:25咏南 delphi 阅读(510) | 评论 (0) 编辑
摘要: 曾经维修一些老系统,查询一个报表,在漫长的等待之后,仍然出来不来结果,而客户端往往是单线程的,这段时间用户只能等的干瞪眼,做不了任何其它的事情,即使让人暴躁如雷,但仍然只能忍受。客户将查询慢的问题投诉过来,处理的工程师往往发现查询的存储过程写的太烂,其实查询的数据量并不大,算法也并不如何的复杂,但结果硬是让烂存储过程给害了。往往对烂存储过程进行优化以后,原来执行需要30分钟,现在可能就只需要几秒钟。写出好的存储过程,其实是有规可循的。算法无非是时空转换,要写出执行快速的存储过程,就要尽量地空间(内存空间)换时间(CPU处理时间)。对存储过程来说,缓存往往就是临时表。在临时表中创建必需要用到的字 阅读全文
posted @  2013-12-03 11:51咏南 delphi 阅读(625) | 评论 (0) 编辑
摘要: 这些天一直在思考如何实现数据库负载均衡集群?数据库负载均衡集群的目的:实现数据的读和写的负载均衡。1.使用数据库自身提供的事务复制可以实现数据库负载均衡集群,但有缺点:通过事务复制实现数据同步大约需要1~2秒的时间,在同步的过程中,数据有可能发生脏读。如果使用对等事务复制,有可能由于多个数据库服务器都同时更改同一行数据而发生冲突,一旦发生冲突,则更改可能失败,而且处理这种冲突会非常复杂。所以这种方案看起来似乎非常简单(数据库自带功能),但细想却不可行。2.自行开发应用服务器可以实现数据库负载均衡集群。数据库事务分为读事务和写事务俩种。首先讲写事务的处理:不使用数据库本身提供的那些数据同步技术, 阅读全文
posted @  2013-11-30 15:40咏南 delphi 阅读(451) | 评论 (0) 编辑
摘要: 先来几张效果图:1.基于DATASNAP构建的中间件,中间件已经经过实际项目的检验,单台中间件可支持几千客户端,中间件可集群2.中间件支持同时连接ACCESS\SQL SERVER\MYSQL\ORACLE。。。多种数据库系统3.中间件同时支持TCP/IP,HTTP,支持最新REST WEBSERVICE4.客户端基于插件架构,全新RIBBON风格5.按包方式组织的工程组,只有需要的时候才加载指定的包6.非常适合大型项目的组织开发 阅读全文
posted @  2013-11-17 15:12咏南 delphi 阅读(1081) | 评论 (0) 编辑
摘要: 朋友有个项目,通信协议使用HTTP,数据序列使用BIN(二进制)。他不知道要选用何种技术方案。REST webservice是http+json,SOAP webservice是http+xml,好像都不适合。于是想到了使用INDY的TidHttpServer控件来实现。TidHttpServer是可以实现webservice中间件的。限于篇幅,省略若干代码。中间件代码://设置绑定参数 IdHTTPServer1.Bindings.Clear; IdHTTPServer1.DefaultPort:= 8000; IdHTTPServer1.Bindings.Ad... 阅读全文
posted @  2013-10-29 22:34咏南 delphi 阅读(4171) | 评论 (1) 编辑
摘要: 从DELPHI2009开始,DATASNAP技术上完全是全新的架构,多层架构不再基于微软的COM,摆脱COM就等于摆脱了WINDOWS的束缚。TCP/IP通信不再需要先开启scktsrvr.exe程序,相信吃过scktsrvr.exe苦头的人不少,比如多核CPU环境容易挂掉(在DELPHI7的时代,多核CPU的电脑还不流行,当时根本没有考虑到多核的问题)、支持客户端数量非常有限。。。。。。虽然scktsrvr.exe后来随着DELPHI新版本而推出的新版本逐步地修正了比如多核CPU环境容易挂掉等一些BUG,但这也只是易博龙为了照顾原来一些软件厂商基于老的MIDAS构建的多层系统的维护。如果你要 阅读全文
posted @  2013-08-26 20:08咏南 delphi 阅读(5675) | 评论 (0) 编辑
摘要: 准备使用DELPHI开发移动设备开发的朋友对DATASNAP REST中间件不可不了解。DATASNAP REST新型WEBSERVICES中间件使用的通信协议和数据封装格式:使用HTTP通信协议,HTTP协议哪个平台都支持;使用JSON作为数据的封装格式,几乎所有的开发语言都可以解析JSON数据。REST的目的就是通过简单的URL来完成对中间层远程方法的调用并返回JSON格式的数据,调用方解析JSON数据然后将数据秀出来。正是基于以上原因,DATASNAP REST中间件才可以为苹果和安卓的移动的NATIVE APP提供数据服务;也可以为WINDOWS、LINUX、MAC等桌面型NATIVE 阅读全文
posted @  2013-08-25 00:29咏南 delphi 阅读(5345) | 评论 (3) 编辑
摘要: DATASNAP是针对企业数据中间件市场而推出来的产品,如果在其它领域用它可能就不会合适。DATASNAP通信使用INDY10,INDY是阻塞型SOCKET。1.如果使用TCP/IP长连接,DATASNAP的负载能力大概是几百。因为众所周知的原因,阻塞型SOCKET,一个SOCKET连接需要中间件开启一个线程为其服务,几百个长连接需要WINDOWS开启几百个线程为之服务。这种情形中间件INDY的线程池其实没有起多大作用。2.为了避免阻塞型INDY的短点,可以使用TCP/IP短连接,DATASNAP的短连接是这样做的:客户端连接上中间件---》客户端向中间件申请数据服务---》中间件返回数据给客 阅读全文
posted @  2013-07-30 15:13咏南 delphi 阅读(3203) | 评论 (0) 编辑
摘要: 1.中间件需要连接SQL SERVER\ORACLE\MYSQL多种数据库,怎么办?【解决】:可以搞多种数据模块池对应多种数据库,一种数据模块池对应一种数据库2.中间件业务对象多,在一个单元里面定义所有的远程方法不合适,而且不同的开发小组分别负责不同的业务,远程方法全部定义在一个单元里面开发确实不方便,怎么办?【解决】:DATASNAP里面一个TDSServerClass对象对应一个业务对象,多个TDSServerClass对象对应多个业务对象。对业务进行分类,根据分类封装出多个业务对象。 阅读全文
posted @  2013-07-30 14:42咏南 delphi 阅读(1178) | 评论 (0) 编辑
该文被密码保护。
posted @  2013-07-20 16:30咏南 delphi 阅读(443) | 评论 (0) 编辑
摘要: 任意对象若想要序列化,他无限分解后,只会剩下:基础数据类型(int、string、DateTime等)和数组,而其余的,皆为浮云。强大的功能的背后总是性能的牺牲。为了支持一切对象,不得不再次牺牲序列化的大小,在每一个集合的元素前都写入其类型。在牺牲序列化后的大小,得到的是——任意对象的复制!在我们总在讨论为了跨平台而使用XML、JSON。。。。。。序列化的时候,请记住,其实我们有种最最原始的方式,那就是结构体和拼字节的序列化方式也是可以跨平台的。而且这种原始的武器真的很简单很强大。至于通讯,简单的SOCKET编程你会吗? 阅读全文
posted @  2013-07-13 15:26咏南 delphi 阅读(357) | 评论 (0) 编辑
摘要: SOA 是一种程序设计思想,其实早在远古时代(计算机史)它就已经出现了。无非就是把系统分解,将数据和业务逻辑部分尽量独立出来,然后以服务形式提供给另外的系统共用。那时也有一些可以实现 SOA 的工具,比如 DCOM、CORBA 等,不过前者仅限于 Windows,后者又太复杂,而且也仅对 C/C++、Delphi、Java 这等语言有较好支持,而且也都是商业开发软件中才会包含,对于开源的脚本类语言来说支持很差甚至没有支持(因为太复杂了,不是什么人都可以实现的了的,能够把整个 CORBA 规范完整读下来,都需要很好的耐心,还不一定都能够完全理解)。之后互联网发展了,XML-RPC 出现了,XML 阅读全文
posted @  2013-07-13 15:24咏南 delphi 阅读(282) | 评论 (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 阅读(916) | 评论 (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 阅读(2084) | 评论 (1) 编辑
摘要: //功能: STRING 的内容流化到 OLEVARIANT 中//参数:function TextToOleData(const AText: string): OleVariant;varnSize: Integer;pData: Pointer;beginnSize :=  阅读全文
posted @  2013-02-27 11:04咏南 delphi 阅读(3569) | 评论 (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 阅读(3479) | 评论 (0) 编辑
摘要: 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 阅读(2083) | 评论 (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 阅读(404) | 评论 (0) 编辑
摘要: 最近做了个断网收银的项目,服务端使用SQL SERVER数据库,收银机使用ACCESS数据库。做了个中间件来同步数据。哪些数据需要同步?新增的数据修改过的数据删除的数据(删除只是置删除标志位,可以视为修改过的数据进行处理)需要同步的数据表统一预留俩个用于数据同步的字段:字段名:CreateDate,数据类型:TDateTime,新增数据的时间戳;字段名:ModifyDate,数据类型:TDateTime,修改过的数据的时间戳。倘若需要同步的数据表内的数据小,可以不使用时间戳,而在每次同步数据之前,先删除表内的所有数据,然后再插入同步的数据。如此编程最为简单,但必须是同步数据较小的情况下。数据同 阅读全文
posted @  2013-01-30 11:17咏南 delphi 阅读(957) | 评论 (1) 编辑
摘要: 如果通讯协议使用TCP/IP,客户端同中间件之间的SOCKET连接是非常有讲究的。应该视应用场合巧妙地使用短连接搭配长连接的方式。纯粹地使用长连接或者纯粹地使用短连接,往往不大合理。如果长时间让一个SOCKET长连接休闲,这无疑是对中间件资源的浪费,如果这种休闲的长连接数量非常多,可能会影响中间件的性能。光靠中间件通过发心跳包自动断开长时间休闲的连接,其实这是中间件对此类事件的最后一道防线。如果远程方程都做成短连接,也不大好,例如一些远程方法成块地执行,如果执行一个远程方法先同中间件建立SOCKET连接,执行完以后立即断开连接,这样就不好。因为建立SOCKET连接比较地耗时,一些远程方法成块地 阅读全文
posted @  2013-01-10 21:08咏南 delphi 阅读(1991) | 评论 (1) 编辑
该文被密码保护。
posted @  2012-12-29 22:24咏南 delphi 阅读(227) | 评论 (0) 编辑
摘要: DataSnap可以直接传递和返回TStream类型的参数,这点是很方便的。但是很多人发现好像大小稍微大点就工作不正常了。DataSnap默认的缓存大小是32k 所以如果流的大小超过这个大小就会被自动分成多个包,这就是传递大量数据的基础,如果一次性发送就可能受到内存的限制。当传递大量数据时获取到的大小是-1,所以如果还是按照一般的方法来读取流的数据就会有问题了。由于流的数据是原始数据包发送,所以在不对数据包压缩加密的情况下,传递速度是和其它方式没有多大区别的。0102030405060708091011121314151617181920212223// FS是一个文件流function TM 阅读全文
posted @  2012-11-23 21:48咏南 delphi 阅读(1070) | 评论 (0) 编辑
摘要: 1.字串统一使用WIDESTRING类型2.客户端调用适配器DLL时,参数传DELTA,不要传TCLIENTDATASET 阅读全文
posted @  2012-09-11 16:03咏南 delphi 阅读(623) | 评论 (1) 编辑
摘要: 客户端可以是D5~XE2任意版本的DELPHI来写。非常适合老系统升级。 阅读全文
posted @  2012-09-07 17:59咏南 delphi 阅读(800) | 评论 (3) 编辑
摘要: xe2 DATASNAP出来一年了。相信许多人同我一样领略它开发中间层的快捷(相对老的MIDAS确实简便了许多)。但苦于自己有许多的老系统是用DELPHI7甚至DELPHI6开发的,想用XE2开发的中间层升级,却不成。直接的话,它们确实是不兼容。还是那句话,既然直接的不行,咱就来间接的。使用桥接模式,正好可以解决问题。至少,我试过了,可以。思路是:使用XE2开发一个动态库,这个动态库负责SOCKET连接中间层,还有参数类型转换(主要是ANSISTRING和UNICODESTRING的问题),在这个桥接的动态库,这些全部都解决了。我测试的时候DELPHI7调用XE2 DATASNAP的中间层跑得 阅读全文
posted @  2012-08-24 14:49咏南 delphi 阅读(959) | 评论 (3) 编辑
摘要: 1.TCP/IP心跳包,XE2 DATASNAP本身已内置,设置几个属性就可以,这个经过了测试。不再需要像DELPHI 2010 DATASNAP那样要自己写代码来处理。2.XE2 DATASNAP内置的线程池是使用的INDY10的线程池。INDY10是阻塞+多线程的通讯控件。实际测试当中发现DATASNAP是一个客户连接对应一个线程,一直到客户连接断开线程才归还线程池中,就算一个客户连接以后啥事也不干,也要一直地占用服务端一个线程对象。有多少个连接客户,服务端就要开启多少个线程。如果客户数量比较多的话,这样是很没有效率的。开启的线程较多,CPU的时间都花在线程的上下文切换上面。所以在大量并发 阅读全文
posted @  2012-06-21 15:14咏南 delphi 阅读(4274) | 评论 (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 阅读(1122) | 评论 (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 阅读(692) | 评论 (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 阅读(901) | 评论 (2) 编辑
摘要: 上传客户端的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 阅读(3072) | 评论 (4) 编辑
摘要: 新的datasnap使用INDY10的线程池。不管你知不知道,DATASNAP都是使用线程池了,这和MIDAS不同,MIDAS默认是没有线程池的。跟踪INDY10线程池类TIdSchedulerOfThreadPool的代码:procedure TIdSchedulerOfThreadPool.Init;begin inherited Init; Assert(FThreadPool<>nil); if not IsDesignTime then begin if PoolSize > 0 then begin with FThreadPool.LockList do try 阅读全文
posted @  2012-03-03 22:52咏南 delphi 阅读(2147) | 评论 (0) 编辑
摘要: 网上有一些讲以RAD方式设置主从表的演示,但是在实际当中不实用。function TsvrDM.ApplyUpdates(const ModuleId: WideString;sqlId:ShortInt; Delta0, Delta1, Delta2, Delta3: OleVariant): Shortint;const sql='Select * from %s where 1<>1'; var aData: array of OleVariant; i:integer; conn:TADOConnection; qry:TADOQuery; dsp:TDat 阅读全文
posted @  2012-02-26 14:23咏南 delphi 阅读(994) | 评论 (0) 编辑
摘要: TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream 阅读全文
posted @  2012-02-26 14:20咏南 delphi 阅读(1128) | 评论 (1) 编辑
摘要: midas支持使用OLEVARIANT序列化对象,最新的DATASNAP支持使用OLEVARAINT和JSON来序列化对象。下面的代码演示OLEVARINAT序列化TPARAMS, TPARAMETERS对象。OLEVARIANT本质上是一个BYTE数组。还原TPARAMS对象procedure VariantToParams(input:OleVariant;par:TParams);// TParam 's property: fieldType, paramName, ParamType, value, size// paramType default value ptinput 阅读全文
posted @  2012-02-26 14:04咏南 delphi 阅读(1057) | 评论 (0) 编辑
摘要: 最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试 阅读全文
posted @  2012-02-25 09:30咏南 delphi 阅读(3420) | 评论 (1) 编辑
摘要: 获得客户端的信息 记得datasnap 2009时,要得到客户端信息,非官方的方法,要去搞什么DSConnectEventObject.ChannelInfo.Id,弄成 TIdTCPConnection。xe2就好得多了。仍然是在DSServer的OnConnect 事件里,DSConnectEventObject.ChannelInfo.ClientInfo就是客户端的信息。能得到啥? 看代码 TDBXClientInfo = recordIpAddress: String;ClientPort: String;Protocol: String;AppName: String;end;也就 阅读全文
posted @  2012-02-23 22:50咏南 delphi 阅读(805) | 评论 (0) 编辑
摘要: 服务器端如何防止DDOS 前面说到DSServer的OnConnect是socket已经完全搭好client都调用connect的服务器方法了才触发的,如果我们到这里才来想起拒绝不合法的ip连接,已经挺晚了:socket已经连接好了,都已经创建线程开始通讯了。怎么做才能在最开始的socket握手里,就让捣蛋鬼死在萌芽中呢。要解决这个问题,当然得从TDSTCPServerTransport下手,因为ServerTransport才是真正负责通讯的,可以在它的OnConnect事件下手procedure TServerContainer1.DSTCPServerTransport1Connect( 阅读全文
posted @  2012-02-23 22:49咏南 delphi 阅读(701) | 评论 (0) 编辑
摘要: TDSAuthenticationManager的用法 xe开始有了TDSAuthenticationManager,这个主要用来做用户认证,用法也很简单服务器端1.TDSAuthenticationManager有两个主要的事件在这个事件里面,看看检测连上来的用户名,密码是否合法,valid如果置为false,这就为非法连接了,DSServer会立刻抛出异常后close连接。另外,UserRoles的设计,我觉得比RO高明。procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject 阅读全文
posted @  2012-02-23 22:47咏南 delphi 阅读(1567) | 评论 (0) 编辑
摘要: 要深刻理解TclientDataSet的两个重要属性:Data、Delta要深刻理解并区分开Tfield的4个重要属性:Value、OldValue、CurValue、NewValueTField的事件触发顺序: 显示时触发:OnGetText 编辑时触发:OnSetText->OnValidate->OnChange (1) OnGetText事件是访问DisplayText或Text时触发。如果数据库中存储的值和要显示给用户看的值不一样,如数据库中存储的是bool型的值,要显示给用户“真”或“假”,可以在这个事件里进行处理。 (2) OnSetText事件是设置字段的值时触发。 阅读全文
posted @  2012-02-21 20:24咏南 delphi 阅读(1190) | 评论 (0) 编辑
摘要: TField.ProviderFlags,这对于组 SQL 来说至关重要!ProviderFlags 是 TProviderFlag 的集合,我们来看看 ProviderFlags 可以包含哪些元素 元素名称 说明 备注 pfInUpdate INSERT / UPDATE 要包含此字段 实际上会不会包含,要看字段值有没有变动而定 pfInWhere UPDATE / DELETE 时要加入 WHERE 实际上会不会加入 WHERE,要看字段值有没有变动而定 pfInKey UPDATE / DELETE 时要加入 WHERE,以及 DataSet 内数据的重复检查 一定会加入WHERE p. 阅读全文
posted @  2012-02-20 23:10咏南 delphi 阅读(968) | 评论 (0) 编辑
摘要: 数据集对象池unit ServerMethodsUnit1;interfaceuses SysUtils, Classes, DSServer, DB, Generics.Collections, DSService, Provider, ADODB;type TServerMethods1 = class(TDSServerModule) procedure DSServerModuleCreate(Sender: TObject); private { Private declarations } ListofQuery : TDictionary<Integer,Tadoquery 阅读全文
posted @  2012-02-20 23:02咏南 delphi 阅读(782) | 评论 (1) 编辑
摘要: TDSServerClass有一个属性LifeCycle,这个属性有三个值,很好理解1.Session,这是默认值。说明:这是默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一个线程来实例化。实例化是什么概念呢?就是这个线程把所有你将要用到的类、函数等等都建立好了,等待你客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有300个客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是个考验。适用环境:这个设置是线程安全的!客户端数量少,每台服务器不超过连接数量: 200 x CPU个数 x (每个CPU核数x0.7) (这是经验值,稳 阅读全文
posted @  2012-02-20 20:48咏南 delphi 阅读(730) | 评论 (2) 编辑
摘要: 可作为参数的类型TDBXWideStringValueTDBXAnsiStringValueTDBXInt16ValueTDBXInt32ValueTDBXInt64ValueTDBXSingleValueTDBXDoubleValueTDBXBcdValueTDBXTimeValueTDBXDateValueTDBXTimeStampValueTDBXBooleanValueTDBXReaderValueTDBXStreamValue可作为var和out的参数的类型booleanSmallIntIntegerInt64SingleDoubleAnsiStringStringTDBXTimeT 阅读全文
posted @  2012-02-20 20:48咏南 delphi 阅读(516) | 评论 (2) 编辑
摘要: //author: cxg//sql工厂unit MySQL;interfaceuses SysUtils, SqlExpr, DBClient, db, DBXCommon,Provider;type TMySQL = class(TObject) private fSqlcommand: string; fQry: TClientDataSet; fSqlMethod: TSqlServerMethod; fSqlConnection: TSQLConnection; fDbxTrans: TDBXTransaction; fP:TDataSetProvider; fD:TClientDa 阅读全文
posted @  2012-02-12 07:18咏南 delphi 阅读(678) | 评论 (0) 编辑
摘要: xe datasnap自动支持TParams对象的序列,无需我们手动序列,真的很方便。远程方法定义示例:function TServerMethods1.GetData(sql: string; params: TParams): TDataSet;begin cds.Close; cds.CommandText := ''; cds.CommandText := sql; cds.Params.Clear; cds.Params := params; cds.Open; Result := cds;end;客户端远程调用示例:function TMySQL.GetData:  阅读全文
posted @  2012-02-12 07:16咏南 delphi 阅读(573) | 评论 (1) 编辑
摘要: //author: cxgunit DSServerContainer;interfaceuses SysUtils, Classes, IniFiles, Windows, Provider, DBClient, DSTCPServerTransport, DSServer, DSCommonServer, DB, ADODB, Generics.Collections, DSService, DBXDataSnap, DBXCommon, DSHTTPLayer, DBXinterbase, forms, DbxCompressionFilter ,IdTCPConnection ,IdW 阅读全文
posted @  2012-02-12 07:09咏南 delphi 阅读(1214) | 评论 (2) 编辑
摘要: 回调除了用REST支持调用DataSnap服务方法外,JSON还用于实现回调方法.DataSnap2010支持客户端回调函数,使其执行在服务方法上下文中.这样就可以实现客户端调用服务端方法时,服务端就可以调用由客户端传递好参数的回调函数.例如,我们修改EchoString方法,向其中添加回调支持.修改后的EchoString方法如下:function EchoString(Value: string; callback: TDBXcallback): string;TDBXcallback类定义在DBXJSON单元.在我们实现EchoString方法前,先搞清楚如何在客户端定义回调函数(毕竟, 阅读全文
posted @  2012-02-11 22:12咏南 delphi 阅读(643) | 评论 (0) 编辑
摘要: 1.连接SQL SERVER数据库procedure TForm1.Button1Click(Sender: TObject);var p: TSQLConnection;begin try p := TSQLConnection.Create(nil); try p.ConnectionName := 'MSSQLConnection'; p.DriverName := 'MSSQL'; p.GetDriverFunc := 'getSQLDriverMSSQL'; p.KeepConnection := true; p.LoginPrompt 阅读全文
posted @  2012-02-11 22:10咏南 delphi 阅读(1737) | 评论 (0) 编辑
摘要: {之前说到中间层通过向客户端暴露方法的方式提供服务,实现数据库数据的读取和更新。方法调用的方式,其潜在的意义,就是说中间层不保存客户端状态信息,就像WEB服务一样,客户端需要自己保存自己的状态信息。进一步说,就是中间层具体提供方法的业务对象实例,不是也不应该专属于某个客户端,它应该能够为不同的客户端调用提供服务。如果我们把业务对象实例放到对象池中集中存放,调用方法时随用随取,方法结束即放回池中。这样就可以实现业务对象实例服务于不同的客户端调用请求。更重要的是,利用对象池,能够最大化服务器各种资源的使用效率,而且对客户端的响应也更快了,因为业务对象实例早就创建好了,取来即用。其实,DataSna 阅读全文
posted @  2012-02-11 22:09咏南 delphi 阅读(915) | 评论 (0) 编辑
摘要: TServerContainer = class(TDataModule) TCP_KeepAlive = record OnOff: Cardinal; KeepAliveTime: Cardinal; KeepAliveInterval: Cardinal; end;procedure TServerContainer.DSServerConnect( DSConnectEventObject: TDSConnectEventObject);var Val: TCP_KeepAlive; Ret: DWord; ClientConnection: TIdTCPConnection;begi 阅读全文
posted @  2012-02-11 22:03咏南 delphi 阅读(474) | 评论 (0) 编辑
摘要: unit SqlQueryPool;interfaceuses Classes, Windows, SysUtils, forms, DB, SqlExpr, FMTBcd;type TSQLQueryPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TSQLQuery; function GetLock(List:TList;Index:  阅读全文
posted @  2012-02-11 22:00咏南 delphi 阅读(679) | 评论 (0) 编辑
摘要: unit SqlStoredPool;interfaceuses Classes, Windows, SysUtils, forms, DB, SqlExpr, FMTBcd;type TSQLStoredPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TSQLStored; function GetLock(List:TList;Inde 阅读全文
posted @  2012-02-11 21:59咏南 delphi 阅读(434) | 评论 (0) 编辑
摘要: //新的DATASNAP已经支持TPARAMS作为远程方法里面的参数,会自动序列TPARAMS,无需手动序列它。//在此只是记录一些JSON序列的用法,无实际意义unit uSerialize;interfaceuses System.SysUtils, Data.Win.ADODB, Data.DBXJSON, Data.DBXJSONReflect, System.Variants, Data.DB;type TSerialize = class public function Serialize(const ModuleId: string; SqlId: Integer; p: TPa 阅读全文
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页