yunye大侠请进!对象连接池的问题(300分)

  • 主题发起人 主题发起人 zqs10597249
  • 开始时间 开始时间
Z

zqs10597249

Unregistered / Unconfirmed
GUEST, unregistred user!
见证
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1618001
 
ok,我下午给你发例子
 
yunye大侠:
谢谢!
 
收到后有问题就问,关键是原理.其实变通的方法还是很多.
 
yunye大侠:
收到了,正在看。有问题会问你的。
谢谢了!
 
TSamplePooledDM = class(TRemoteDataModule, ISamplePooledDM)
这个单元一定要新建的服务器吗?
可以不可以从
TPooledRDM = class(TRemoteDataModule, IPooledRDM)继承?
TSamplePooledDM = class(TPooledRDM , ISamplePooledDM)
然后TSamplePooledDM里面的DataSetProvider2数据提供我只做这个事情。其他不用他。
那么把你的代码直接用到系统里就可以了。是吧
 
我原来的系统
TFRMRDM = class(TRemoteDataModule, IPAS_IRMSRDM)
DbPAS_IRMS: TADOConnection;
QryDo: TADOQuery;
QryModify: TADOQuery;
QryCreate: TADOQuery;
QryQuery: TADOQuery;
DSPQuery: TDataSetProvider;
procedure RemoteDataModuleCreate(Sender: TObject);
//
TFRMPUBRDM = class(TFRMRDM,IPAS_IRMSPUBRDM)
DspToolBarFrmCtrl: TDataSetProvider;
QryToolBarFrmCtrl: TADOQuery;
private
现在是不是加个CSamplePooledDM和pooler我的系统就可以用到对象连接池了?
 
yunye大侠:怎么不回我的问题呀?
 
可以重TPooledRDM继承,在TPooler里你要区分处理IPAS_IRMSRDM和你继承的TFRMPUBRDM
的接口IPAS_IRMSPUBRDM
 
大侠:怎么区分?
在TPooler里你要区分处理IPAS_IRMSRDM和你继承的TFRMPUBRDM
的接口IPAS_IRMSPUBRDM
您发给我的例子里要改哪些吗?
 
yunye大侠:
你给我的例子里,如果我在unit srvrdm;下加个接口。
难道unit CSamplePooledDM;也要申明个一样的吗?不然怎么编译过呢?
 
你说的是不是加一个接口方法并让客户端能调用?
那你在TPooler里对应要加一个方法,记住TPooler实际上是你的RDM对象的代理,
客户端所有的业务方法都是通过它来中转的,所以在中转的过程中你才能实际区
分调用不同的RDM或服务器上的其他接口对象。
我给你分析一下没有TPooler对象和有TPooler的系统体系:
没有TPooler时实际上是
客户端->取得服务器业务对象的接口->通过接口访问实际的服务器业务对象
在有TPooler时应该是:
客户端->取得服务器业务对象的接口->通过接口访问实际的TPooler对象->
TPooler对象根据客户端掉用的方法或参数动态决定创建或取得什么业务对象(RDM)->
->调用此业务对象的方法->把结果返回给客户端
所以在有TPooler对象做中转时,你的TPooler的方法应该是涵盖了所有服务器端可调用的
接口和方法,由于Delphi带的Pooler例子TPooler对象是实现的IPoolerRDM接口,所以你在
别的RDM(比如我的SamplePoolerDM)里的接口方法在IPoolerRDM里也要申明,并在实现代
码里去调用ISamplePoolerDM里的方法,我的建议是你独立创建一个RDM也就是专门做中转的
RemoteDataModule,在这个RDM里申明时实现多个不同的RDM接口比如
TPoolerEx = class(TRemoteDataModule, IPoolerEx,IRDM1,IRDM2,...)
在实现不同RDM接口的方法时,你用池来访问不同的RDM对象,并中转调用结果,也就是这个TPoolerEx
对象实现了所有服务器端需要被客户端掉用的方法,麻烦就在于你要手工同步方法,也就是说
比如你在IRDM1里增加了一个接口方法那在TPoolerEx里也要实现一下这个方法,毕竟你要通过它
来中转啊,我想你的本意可能有两个,一个是用池的概念来使服务器的访问效率提高,另一个是
是在客户端之用一个DComConnection或SocketConnection,我建议还是最好不要去实现IAppServer的那
几个方法,如AS_GetProviderNames之类的,虽然你在开发客户端时略微麻烦了一点,不能直接调用
ClientDataSet的ApplyUpdate方法,但你完全可以将ClientDataSet的Delta倒出,然后在TPoolerEx里
申明几个方法比如取得结果集、更新结果集。。这些方法参数是你需要处理的结果集和你需要哪个RDM对
象处理的标识,这样也是可以的。我们目前的系统就是在客户端用ClientDataSet,服务器用Java编写,
中间通过Soap方法调用传递需要处理的结果集(XML格式),对于大型复杂系统一样可以,但如果你要方便
要使用Delphi提供的IAppserver的自动更新、读取功能那你就要去实现IAppServer的 AS_...这几个方法,
这样你在客户端的调用就能与服务器连动。
 
那干脆我做多个象TPooler的服务
有8个服务器,我就写8个不是很简单?
 
你说的是不是加一个接口方法并让客户端能调用?
那你在TPooler里对应要加一个方法,记住TPooler实际上是你的RDM对象的代理,
客户端所有的业务方法都是通过它来中转的,所以在中转的过程中你才能实际区
分调用不同的RDM或服务器上的其他接口对象。
我给你分析一下没有TPooler对象和有TPooler的系统体系:
没有TPooler时实际上是
客户端->取得服务器业务对象的接口->通过接口访问实际的服务器业务对象
在有TPooler时应该是:
客户端->取得服务器业务对象的接口->通过接口访问实际的TPooler对象->
TPooler对象根据客户端掉用的方法或参数动态决定创建或取得什么业务对象(RDM)->
->调用此业务对象的方法->把结果返回给客户端
所以在有TPooler对象做中转时,你的TPooler的方法应该是涵盖了所有服务器端可调用的
接口和方法,由于Delphi带的Pooler例子TPooler对象是实现的IPoolerRDM接口,所以你在
别的RDM(比如我的SamplePoolerDM)里的接口方法在IPoolerRDM里也要申明,并在实现代
码里去调用ISamplePoolerDM里的方法,我的建议是你独立创建一个RDM也就是专门做中转的
RemoteDataModule,在这个RDM里申明时实现多个不同的RDM接口比如
TPoolerEx = class(TRemoteDataModule, IPoolerEx,IRDM1,IRDM2,...)
在实现不同RDM接口的方法时,你用池来访问不同的RDM对象,并中转调用结果,也就是这个TPoolerEx
对象实现了所有服务器端需要被客户端掉用的方法,麻烦就在于你要手工同步方法,也就是说
比如你在IRDM1里增加了一个接口方法那在TPoolerEx里也要实现一下这个方法,毕竟你要通过它
来中转啊,我想你的本意可能有两个,一个是用池的概念来使服务器的访问效率提高,另一个是
是在客户端之用一个DComConnection或SocketConnection,我建议还是最好不要去实现IAppServer的那
几个方法,如AS_GetProviderNames之类的,虽然你在开发客户端时略微麻烦了一点,不能直接调用
ClientDataSet的ApplyUpdate方法,但你完全可以将ClientDataSet的Delta倒出,然后在TPoolerEx里
申明几个方法比如取得结果集、更新结果集。。这些方法参数是你需要处理的结果集和你需要哪个RDM对
象处理的标识,这样也是可以的。我们目前的系统就是在客户端用ClientDataSet,服务器用Java编写,
中间通过Soap方法调用传递需要处理的结果集(XML格式),对于大型复杂系统一样可以,但如果你要方便
要使用Delphi提供的IAppserver的自动更新、读取功能那你就要去实现IAppServer的 AS_...这几个方法,
这样你在客户端的调用就能与服务器连动。
 
说句实在话,TPooler里的例子不是很有用,实际上从效率上来说,就是创建一个RemoteDataModule
的速度,但TPooler的复杂度实在是。。,而且如果真要用Pooler我们以前考虑用MTS,后来有了COM+,
我估计也差不多。所以对象池的问题还是交给中间件系统来处理比较好(比如Corba,COM+,MTS),而以前
之所以要池,我想是由于使用BDE的问题,在BDE第一次连接时是比较慢,但现在用ADO更本就没必要用
池,ADO自己会Pooler它的连接,速度应该可以(我现在中间件不用Microsoft的东东了,所以不好说ADO
怎样),想它能用在网站的垃圾程序中(用ASP的人都不考虑这些,要用时就创建一个数据库连接),
所以说应该在ADO连接的内部处理中Microsoft做得还是不错的。如果你用ADO根本就不用池,因为ADO内部
已经自己处理了,这是我的建议。
 
我觉得Ado只是处理了数据库连接池的问题。
我们现在考虑的是对象连接池。
也有考虑用中间件技术。可是我们的技术框架已经成型了。
想改不是很容易的事情。所以麻烦。
不过我会好好考虑你的建议的。
谢谢了!
 
yunye大侠:
暂时连接池没有什么问题了。
我的qq是:49427523
能交为好友吗?谢谢了!
 
偶的qq是164544995,偶已经加你了,不过我不总上,有事发email吧,hawk_1900@263.net
 
多谢您了。哈哈!
 
后退
顶部