三层DCOM中用几个DataSetProvider组件,客户端访问会更快.(100分)

  • 主题发起人 主题发起人 pyzhx801225
  • 开始时间 开始时间
P

pyzhx801225

Unregistered / Unconfirmed
GUEST, unregistred user!
三层DCOM中用几个DataSetProvider组件,客户端访问会更快.
 
我觉得一个就可以了吧,DCOM应该具备对象复制的功能 每个连接都复制了一个独立的连接对象。个人看法
 
我也试验了,好像一个就够了,不过我看别人作的三层用了好多,我想是不是没有必要,还是其中有什么原因.
 
看看下面的DataBkr中的代码,就可以得到答案:
...
function TRemoteDataModule.GetProvider(const ProviderName: string): TCustomProvider;
var
i: Integer;
begin
Result := nil;
for i := 0 to FProviders.Count - 1do
if AnsiCompareText(TCustomProvider(FProviders).Name, ProviderName) = 0 then
begin
Result := TCustomProvider(FProviders);
if not Result.Exported then
Result := nil;
Exit;
end;
if not Assigned(Result) then
raise Exception.CreateResFmt(@SProviderNotExported, [ProviderName]);
end;
...
function TRemoteDataModule.AS_GetRecords(const ProviderName: WideString;
Count: Integer;
out RecsOut: Integer;
Options: Integer;
const CommandText: WideString;
var Params, OwnerData: OleVariant): OleVariant;
begin
Lock;
try
Result := Providers[ProviderName].GetRecords(Count, RecsOut, Options,
CommandText, Params, OwnerData);
finally
UnLock;
end;
end;
...
可见,客户端调用服务器接口时,是按照ProviderName在Providers中去找对应的DataSetProvider。
因此,一个RemoteDataModule中如果放较多的DataSetProvider,是会稍微影响点客户端的响应效率的。
 
如果就用一个DataSetProvider的话,很多客户端同时防问,速度会不会很慢.
 
看你怎么定义自己的应用服务器线程模式了。
如果是下面的这种多线程Apartment,一个客户就有一个对应的服务线程的话,就不会发生客户端排队等候处理的现象了。
initialization
TComponentFactory.Create(ComServer, TcomXxxDM,
Class_comXxxDM, ciMultiInstance, tmApartment);
 
to wangming_, :你看来是个高手.
你的意思说利用线程来解决问题?有没有具体的例子或代码?先谢了.
 
对于三层我暂未能深入研究,只是在应用中发现一个问题,如果多个ClientDataSet使用同一个DataSetProvider可能会导致数据更新出现异常,如:
ClientDataSet1与ClientDataSet2使用同一个DataSetProvider1,DataSetProvider1连接某个ADOQuery数据源,ClientDataSet1首先Open,然后ClientDataSet2再Open,此时如果对ClientDataSet1执行新增或修改等操作,则ApplyUpdate后数据可能并没有实际更新到数据库中,即刚才的更新操作无效,而且不会提示错误。
ClientDataSet我主要使用CommandText的方式来打开数据表,不知是否有哪些环节导致这样的问题?
 
to pyzhx801225:
Delphi缺省下构建DCOM服务就是多线程和保持状态的,可类比.NET remoting的客户端激活对象。开发者心里有这个概念就行了,不必自己写任何代码来达到这个目的。
例如用Delphi的向导构建一个TRemoteDataModule:
。。。
type
Taa = class(TRemoteDataModule, Iaa)
。。。
end;
。。。
initialization
TComponentFactory.Create(ComServer, Taa,
Class_aa, ciMultiInstance, tmApartment);
end.

to raylo:
同样,因为Delphi缺省下是构建有状态的远程对象,所以,如果ClientDataSet使用CommandText的方式来打开数据表,ClientDataSet1和ClientDataSet2同时连一个DataSetProvider1,假如不在应用服务端控制打开的数据集和提交,绝对会产生混乱的,因为当第一个ClientDataSet1打开时,DataSetProvider1会保留ClientDataSet1的SQL信息,再打开ClientDataSet2后,DataSetProvider1又会保留ClientDataSet2的SQL信息,此时提交ClientDataSet1的更新的话,就必然出错了。
 
我一般全部采用SQL语句来增加记录,基本上不用数据集增加记录.
看来一个DataSetProvider就够了.
 
后退
顶部