随笔分类 -  delphi datasnap 中间件

上一页 1 ··· 5 6 7 8 9 10 下一页
delphi datasnap 中间件
摘要:新的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中间件 阅读(3728) 评论(0) 推荐(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中间件 阅读(2048) 评论(0) 推荐(1) 编辑
摘要:TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream 阅读全文
posted @ 2012-02-26 14:20 delphi中间件 阅读(1897) 评论(1) 推荐(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中间件 阅读(2066) 评论(0) 推荐(0) 编辑
摘要:最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试 阅读全文
posted @ 2012-02-25 09:30 delphi中间件 阅读(5962) 评论(1) 推荐(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中间件 阅读(1366) 评论(0) 推荐(1) 编辑
摘要:服务器端如何防止DDOS 前面说到DSServer的OnConnect是socket已经完全搭好client都调用connect的服务器方法了才触发的,如果我们到这里才来想起拒绝不合法的ip连接,已经挺晚了:socket已经连接好了,都已经创建线程开始通讯了。怎么做才能在最开始的socket握手里,就让捣蛋鬼死在萌芽中呢。要解决这个问题,当然得从TDSTCPServerTransport下手,因为ServerTransport才是真正负责通讯的,可以在它的OnConnect事件下手procedure TServerContainer1.DSTCPServerTransport1Connect( 阅读全文
posted @ 2012-02-23 22:49 delphi中间件 阅读(1362) 评论(0) 推荐(1) 编辑
摘要:TDSAuthenticationManager的用法 xe开始有了TDSAuthenticationManager,这个主要用来做用户认证,用法也很简单 服务器端 1.TDSAuthenticationManager有两个主要的事件 在这个事件里面,看看检测连上来的用户名,密码是否合法,valid 阅读全文
posted @ 2012-02-23 22:47 delphi中间件 阅读(3147) 评论(0) 推荐(1) 编辑
摘要:要深刻理解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中间件 阅读(2171) 评论(0) 推荐(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中间件 阅读(1903) 评论(0) 推荐(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中间件 阅读(1739) 评论(1) 推荐(1) 编辑
摘要:TDSServerClass有一个属性LifeCycle,这个属性有三个值,很好理解1.Session,这是默认值。说明:这是默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一个线程来实例化。实例化是什么概念呢?就是这个线程把所有你将要用到的类、函数等等都建立好了,等待你客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有300个客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是个考验。适用环境:这个设置是线程安全的!客户端数量少,每台服务器不超过连接数量: 200 x CPU个数 x (每个CPU核数x0.7) (这是经验值,稳 阅读全文
posted @ 2012-02-20 20:48 delphi中间件 阅读(1664) 评论(2) 推荐(1) 编辑
摘要:可作为参数的类型TDBXWideStringValueTDBXAnsiStringValueTDBXInt16ValueTDBXInt32ValueTDBXInt64ValueTDBXSingleValueTDBXDoubleValueTDBXBcdValueTDBXTimeValueTDBXDateValueTDBXTimeStampValueTDBXBooleanValueTDBXReaderValueTDBXStreamValue可作为var和out的参数的类型booleanSmallIntIntegerInt64SingleDoubleAnsiStringStringTDBXTimeT 阅读全文
posted @ 2012-02-20 20:48 delphi中间件 阅读(1511) 评论(2) 推荐(0) 编辑
摘要://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中间件 阅读(1175) 评论(0) 推荐(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中间件 阅读(972) 评论(1) 推荐(0) 编辑
摘要://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中间件 阅读(2127) 评论(3) 推荐(0) 编辑
摘要:回调除了用REST支持调用DataSnap服务方法外,JSON还用于实现回调方法.DataSnap2010支持客户端回调函数,使其执行在服务方法上下文中.这样就可以实现客户端调用服务端方法时,服务端就可以调用由客户端传递好参数的回调函数.例如,我们修改EchoString方法,向其中添加回调支持.修改后的EchoString方法如下:function EchoString(Value: string; callback: TDBXcallback): string;TDBXcallback类定义在DBXJSON单元.在我们实现EchoString方法前,先搞清楚如何在客户端定义回调函数(毕竟, 阅读全文
posted @ 2012-02-11 22:12 delphi中间件 阅读(1241) 评论(0) 推荐(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中间件 阅读(3304) 评论(0) 推荐(0) 编辑
摘要:{之前说到中间层通过向客户端暴露方法的方式提供服务,实现数据库数据的读取和更新。方法调用的方式,其潜在的意义,就是说中间层不保存客户端状态信息,就像WEB服务一样,客户端需要自己保存自己的状态信息。进一步说,就是中间层具体提供方法的业务对象实例,不是也不应该专属于某个客户端,它应该能够为不同的客户端调用提供服务。如果我们把业务对象实例放到对象池中集中存放,调用方法时随用随取,方法结束即放回池中。这样就可以实现业务对象实例服务于不同的客户端调用请求。更重要的是,利用对象池,能够最大化服务器各种资源的使用效率,而且对客户端的响应也更快了,因为业务对象实例早就创建好了,取来即用。其实,DataSna 阅读全文
posted @ 2012-02-11 22:09 delphi中间件 阅读(1828) 评论(0) 推荐(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中间件 阅读(866) 评论(0) 推荐(0) 编辑

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