多用户同时访问的有关问题(三层c/s):已头痛了二个月了,不胜感谢!

多用户同时访问的问题(三层c/s):已头痛了二个月了,不胜感谢!!!
环境:
  delphi2005+ClientSocket+Ado+Server
我应用demo下的用户池连接管理MIDAS\Pooler的例子
三层模式为ciInternal,   tmApartment
我的源码如下
server:
--------------------------------------------
function   TFun_Cms.GetLargeData(const   Dbname,   Cmdstr:   WideString;
            Rcount:   Integer;const   Uip:   WideString):   OleVariant;
var
    CL:TRTLCriticalSection;
    Q:Tadoquery;
    CDS:Tclientdataset;
    DSP:Tdatasetprovider;
begin
    try
        InitializeCriticalSection(CL);
        EnterCriticalSection(CL);
        Q:=GetNewAdoquery(Uip);
        CDS:=GetNewClientdataset(Uip);
        DSP:=GetNewDatasetProvider;
        //
            DSP.DataSet:=Q;
            if   Q.Active   then
            begin
              Form1.Memo1.Lines.Add( 'TFun_Cms.exit ');
              exit;
            end;
            CDS.SetProvider(DSP);
            Q.Close;
            Q.SQL.Clear;
            Q.SQL.Text:=CmdStr;
            Q.MaxRecords:=Rcount;
            CDS.Active:=False;
            CDS.FetchOnDemand:=False;
            CDS.PacketRecords:=Rcount;
            CDS.Active:=True;
            Result:=CDs.Data;
    finally
        FreeExistClientDataset(CDS);
        FreeExistDatasetProvider(DSP);
        FreeExistAdoquery(Q);
        LeaveCriticalSection(CL);
    end;
end;
function   GetnewCName:String;
var
    AGuid:TGuid;
    NewValue:String;
begin
    OleCheck(CreateGuid(AGuid));
    NewValue:=GuidToString(Aguid);
    NewValue:=f_Replace(NewValue, '- ', '_ ');
    Result:= 'C '+Copy(NewValue,2,Length(NewValue)-2);
end;
function   GetNewAdoquery(kv:string):Tadoquery;
var
    Q:Tadoquery;
begin
      Q:=Tadoquery.Create(nil);
      Q.Name:=GetnewCName;
      Q.Connection:=dm.dbConn;
      Q.CacheSize:=1000;
      Q.CursorType:=ctStatic;
      Q.LockType:=ltBatchOptimistic;
      Form1.Memo1.Lines.Add( 'GetNewAdoquery '+q.name+ ', '+kv);
      Result:=Q;
end;

procedure   FreeExistAdoquery(Q:Tadoquery);
begin
    Form1.Memo1.Lines.Add( 'FreeExistAdoquery '+q.name);
    Q.Close;
    Q.SQL.Clear;
    Q.Free;
end;

function   GetNewStoredProc:TADOStoredProc;
var
    SP:TADOStoredProc;
begin
      SP:=TADOStoredProc.Create(nil);