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;
保护起来,只被一个线程访问,
先写到这里了.......