-
Notifications
You must be signed in to change notification settings - Fork 3
/
uDBSetProviderPool.pas
89 lines (73 loc) · 1.62 KB
/
uDBSetProviderPool.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit uDBSetProviderPool;
interface
uses
uDBSetProvider, Contnrs, SyncObjs;
type
TDBSetProviderPool = class(TObject)
private
FListProviders: TObjectList;
public
constructor Create;
destructor Destroy; override;
function GetDataBaseFromPool(param: TDBConnectParams): TDBSetProvider;
procedure PutDataBaseToPool(provider: TDBSetProvider);
end;
var
ProviderPool: TDBSetProviderPool;
implementation
var
csPool: TCriticalSection;
{ TDBSetProviderPool }
constructor TDBSetProviderPool.Create;
begin
FListProviders := TObjectList.Create(true);
end;
destructor TDBSetProviderPool.Destroy;
begin
FListProviders.Free;
inherited;
end;
function TDBSetProviderPool.GetDataBaseFromPool(param: TDBConnectParams): TDBSetProvider;
var
i: Integer;
newProvider: TDBSetProvider;
begin
csPool.Acquire;
try
newProvider := nil;
for i := 0 to FListProviders.Count-1 do
if not TDBSetProvider(FListProviders[i]).Active then
begin
newProvider := TDBSetProvider(FListProviders[i]);
break;
end;
if not Assigned(newProvider) then
begin
newProvider := TDBSetProvider.Create;
FListProviders.Add(newProvider);
end;
newProvider.Connect(param);
if newProvider.Active then
result := newProvider
else
result := nil;
finally
csPool.Release;
end;
end;
procedure TDBSetProviderPool.PutDataBaseToPool(provider: TDBSetProvider);
begin
csPool.Acquire;
try
provider.Disconnect;
finally
csPool.Release;
end;
end;
initialization
csPool := TCriticalSection.Create;
ProviderPool := TDBSetProviderPool.Create;
finalization
ProviderPool.Free;
csPool.Free;
end.