有关Delphi Demo 中的 pooling 问题(200分)

  • 主题发起人 主题发起人 microd
  • 开始时间 开始时间
M

microd

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]有谁能细解Delphi Demo 中的 pooling 如能认我参透其中的原理,我将把我的老本送上
 
pooling是什么
 
是在 Demos--midas--pooler例子中吗?
 
delphi的Pooler分析
(自己写的,由于经验不足,有什么不对的地方请各位DFW指教)
Demos/midas/pooler事实上是一个实现对象共享(object pooling)的远程数据模块
客户端调用Pooler的Com对象,然后Pooler通过PoolManager得到未使用的RDms(远程数据模块),
然后标示为使用,等调用完,再标示为未使用,由于调用完这个数据模块并没有释放掉,
下一次调用就会直接使用该RDms,而不用创建,从而提高再调用速度.
大概流程是这样的Pooler-->PoolManage-->RDMs
服务端的实现
RDMs
为了共享远程数据模块RDMs,服务端端必须是无状态的,即服务端不会不保持上一次调用的信息,
共享的RDMs必须在tmApartment,tmFree, tmBoth线程下
RDMs只能被内部访问(实例类型为ciInternal),所以注册表找不到,所有的访问该类都是通过委托Pooler类实现的.
如果你在Type Library会看到两个不同的类,一个是RDMs类,另一个是Pooler类
Pooler
Pooler类是管理被缓冲的RDMs.实现了所有RDMS的接口,每个调用都是得到标示没被使用的RDMs,然后在调用中标示为使用
Pool manage
Pool manage是一个管理一系列被缓冲的RDMs并返回一个没被使用的RDMs,
调用的流程是这样的,当客户调用时TPooler的AS_XXX方法时,会调用PoolManager.LockRDM方法
该方法首先会从FRDMList的列表中找已生成未被使用的RDMs,如果找到了,返回该RDMs,未被找到,
Create一个,加入FRDMList列表,假如客户端第一次调用得到一个表的记录,由于FRDMList还没有RDms
于是生成了一个,当记录全部返回,RDMS并不释放,仍然在内存中,只是标示为未被使用,于是另一个客户端
连上来也要得到这些记录,只要直接利用这个已经创建过的RDMS,由于TPooler是tmFree线程模式,Pool manage
得到RDms要用
FCriticalSection.Enter;
try
.......
finally
FCriticalSection.Leave;
end;
保护起来,只被一个线程访问,
先写到这里了.......


 
谢谢 shiningplus 的回复,已明白八九层,不过要回去试试看,如何来实现,
希望阁下有时间再给小弟深入的讲一讲。
 
先给 shinigpuls 150 ,
 
[^]。To shinigpuls ,我给分给错了(li_cj), 请放心,等以后有分,我给你加上,Sorry
 
To shinigpuls ,我在类型库编辑器中增加了一个类,然后按Demo中的把新增的类COPY Demo
中的代码,结果重新刷新时,其COPY Demo中的代码:
class function CoPooler.CreateRemote(const MachineName: string): IPooledRDM;
begin
Result := CreateRemoteComObject(MachineName, CLASS_Pooler) as IPooledRDM;
end;
全部被自动清空了。请问这是为什么。
 
在类型库编辑器增加任何东西,必须在工具栏上按一下refresh implementation
他会自动生成框架,然后再填写,否则他是不认的
 
To shinigpuls
谢谢你的回复,经过昨晚的努力,基本明白如何处理。现在又有一个新问题想请教阁下:
我想通过客户动态改变,RDM中的数据连接,而且改变后在客户端立即生效。
 
后退
顶部