Ahoj,
při vývoji (Rad studio 10.2) jsme narazili na problém při použití poolu connections pro Firebird 2.5 z vícevláknové aplikace. Na linuxu roste paměť a to poměrně vysokým tempem několik MB za minutu při normálním provozu. Na Windows se chová dobře, resp. paměť zůstává konstantní. Udělali jsme si i malý testovací prográmek, viz níže a chová se jinak na Windows a na Ubuntu. Podle článků je použití poolu při přístupu k DB z vícevláknové aplikace správné. Řešíme již několik dní a zatím bez úspěchu.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.ConsoleUI.Wait,
Data.DB, FireDAC.Comp.Client, FireDAC.Phys.FB, FireDAC.Phys.FBDef,
FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.UI;
var
gParams: TStringList;
FDPhysFBDriverLink1: TFDPhysFBDriverLink;
FDManager: TFDManager;
gFDConnection: TFDConnection;
gFDQuery: TFDQuery;
begin
try
{$IFDEF LINUX}
FDPhysFBDriverLink1 := TFDPhysFBDriverLink.Create(nil);
FDPhysFBDriverLink1.VendorLib := '/usr/lib/x86_64-linux-gnu/libfbclient.so.2';
{$ENDIF}
FDManager := TFDManager.Create(nil);
gParams := TStringList.Create;
try
//gParams.Add('Database=/var/HavisDatabase/HAVISIII.FDB');
gParams.Add('Database=C:\E\Starmon\Projekty\HAVISIII\AppService\DB\HAVISIII.FDB');
gParams.Add('User_Name=SYSDBA');
gParams.Add('Password=masterkey');
gParams.Add('Pooled=True');
gParams.Add('POOL_MaximumItems=3'); // 300 současných přístupů do DB
gParams.Add('POOL_ExpireTimeout=30000');
gParams.Add('POOL_CleanupTimeout=90000');
gParams.Add('CharacterSet=UTF8');
FDManager.AddConnectionDef('Firebird_pooled1', 'FB', gParams);
while True do
begin
gFDConnection := TFDConnection.Create(nil);
gFDQuery := TFDQuery.Create(nil);
try
gFDConnection.ConnectionDefName := 'Firebird_pooled1';
gFDQuery.Connection := gFDConnection;
gFDConnection.Connected := True;
gFDQuery.SQL.Text := 'SELECT * FROM SWITCHBOARDS';
gFDQuery.Open();
gFDQuery.Last;
finally
gFDQuery.Close;
gFDConnection.Close;
gFDQuery.Free;
gFDConnection.Free;
end;
sleep(100);
end;
finally
FDManager.CloseConnectionDef('Firebird_pooled1');
FDManager.Free;
gParams.Free;
{$IFDEF LINUX}
FDPhysFBDriverLink1.Free;
{$ENDIF}
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Uvítám jakékoli rady, na co se zaměřit.
Díky moc