unit SqlQueryPool;
interfaceuses Classes, Windows, SysUtils, forms, DB, SqlExpr, FMTBcd;type TSQLQueryPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TSQLQuery; function GetLock(List:TList;Index: Integer): Boolean; public property Timeout:Integer read FTimeout write FTimeout; property MaxCount:Integer read FMaxCount; constructor Create(ACapicity:Integer=30);overload; destructor Destroy;override; function Lock: TSQLQuery; procedure UnLock(var Value: TSQLQuery); end;var DBXQryPool: TSQLQueryPool;implementationconstructor TSQLQueryPool.Create(ACapicity:Integer=30);begin FObjList:=TThreadList.Create; FTimeout := 3000; FMaxCount := ACapicity; FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil); end;function TSQLQueryPool.CreateNewInstance(List:TList): TSQLQuery;var p: TSQLQuery;begin try p := TSQLQuery.Create(nil); p.Tag := 1; List.Add(p); Result := p; except Result := nil; Exit; end;end;destructor TSQLQueryPool.Destroy;var i: Integer; List:TList;begin List:=FObjList.LockList; try for i := List.Count - 1 downto 0 do begin TSQLQuery(List[i]).Free; end; finally FObjList.UnlockList; end; FObjList.Free; FObjList := nil; CloseHandle(FSemaphore); inherited Destroy;end;function TSQLQueryPool.GetLock(List:TList;Index: Integer): Boolean;begin try Result := TSQLQuery(List[Index]).Tag = 0; if Result then TSQLQuery(List[Index]).Tag := 1; except Result :=False; Exit; end;end;function TSQLQueryPool.Lock: TSQLQuery;var i: Integer; List:TList;begin try Result := nil; if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then Exit; List:=FObjList.LockList; try for i := 0 to List.Count - 1 do begin if GetLock(List,i) then begin Result := TSQLQuery(List[i]); // PostMessage(Application.MainForm.Handle, 8888,23,0); Exit; end; end; if List.Count < MaxCount then begin Result := CreateNewInstance(List); // PostMessage(Application.MainForm.Handle, 8888,21,0); end; finally FObjList.UnlockList; end; except Result :=nil; Exit; end;end;procedure TSQLQueryPool.Unlock(var Value: TSQLQuery);var List:TList;begin try List:=FObjList.LockList; try TSQLQuery(List[List.IndexOf(Value)]).Tag :=0; ReleaseSemaphore(FSemaphore, 1, nil); finally FObjList.UnlockList; end; // PostMessage(Application.MainForm.Handle, 8888, 22, 0); except Exit; end;end;initialization DBXQryPool := TSQLQueryPool.Create();finalization FreeAndNil(DBXQryPool);end.