多用户同时访问的有关问题(三层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);
环境:
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);