I am currently working on a multi-threaded server application, and I plan to use Firedac to access data. From the docs here: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Multithreading_(FireDAC) , it seems that the same TFDConnectionand / or TFDQueryshould not be accessed from multiple threads at the same time (instead these objects must be created based on threads).
Therefore, the example shown in the previous link, centralizes TFDConnectionand TFDQueryin the object TThread. However, in my case, I have no control over the creation of threads (which is controlled by the server environment). Therefore, I limit the life cycle of objects TFDConnectionand the TFDQuerylifetime of the procedure, which can potentially be called from several threads:
procedure TAPMFiredacTemplate.executeSQL(sql:string);
var
oConn: TFDConnection;
oQuery: TFDQuery;
begin
oConn := TFDConnection.Create(nil);
oQuery := TFDQuery.Create(nil);
try
oConn.ConnectionDefName := self.ConnectionDefinitionName;
oConn.Connected := True;
oQuery.Connection := oConn;
oQuery.Open(sql);
while not oQuery.Eof do
begin
// process query
oQuery.Next;
end;
finally
if assigned(oQuery) then
begin
oQuery.Close;
oQuery.Free;
end;
if assigned (oConn) then
begin
oConn.Connected := False;
oConn.Free;
end;
end;
Is this approach valid? Does performance arise during the systematic creation of an object TFDQuery?
Note . To improve performance, I plan to use the definition of a private federated joint (which is used TFDConnection). Therefore, from my understanding, even when I release TFDConnection, the physical connection is not destroyed, but returned instead of the pool:
oParams := TStringList.Create;
oParams.Add('Database=localhost:c:\apm\databases\mydb.FDB');
oParams.Add('User_Name=xxxxx');
oParams.Add('Password=xxxxxx');
oParams.Add('Pooled=True');
FDManager.AddConnectionDef('Firebird_Pooled','FB',oParams);
FDManager.Active := True;