Méně známou vlastností FireDAC je, že obsahuje přímo podporu pro Connection Pool.
Co je Connection pool? Connection pool je třída obsahujicí kolekci otevřených připojeni. V případě vícevláknových aplikací (tj. např. všechny ty REST servery nebo cokoliv kde obsluhuje více požadavků zároveň, případně i normální aplikace, kde používáte více dynamických connection) většinou potřebují přístup do databáze.
FireDAC je threadsafe (tj. bezpečné použítí ve vláknu) jen v případě, že vlákno má vlastní Connection (to je normální požadavek napříč jazyky nebo platformami). Přičemž největší režie je právě vytvoření připojení do DB. Proto se používá mechanismus ConnectionPool, kdy už nepoužívané Connection objekty jsou po nějakou dobu k dispozici a další požadavek na novou connection bude uspokojen některou z těchto Connection.
Nebojte se, FireDAC to má elegantně vyřešeno.
Základem je mít Connection typu Persistent nebo Private. To první znamená, že Connection má jméno (tj. většinou přes IDE), to druhé je, že parametry připojení vytváříte za běhu a pojmenujete ho (tento přístup používám já prakticky výhradně).
Na začátku z hlavního vlákna ještě je třeba nastavit FDManager.Active := True;.
Nyní definujete parametry připojení:
var
oParams: TStrings;
begin
oParams := TStringList.Create;
oParams.Add('Database=xxx');
oParams.Add('User_Name=userDemo');
oParams.Add('Password=a');
oParams.Add('Pooled=True');
FDManager.AddConnectionDef('MSSQL_Pooled', 'MSSQL', oParams);
Tímto je definováno připojení s názvem MSSQL_Pooled typu MSSQL. Zásadní je nastavit parametr Pooled. A to je vše.
Nyní když ve vláknu potřebujeme novou Connection, tak se nám přidělí z našeho Connection Poolu.
var
oConn: TFDConnection;
begin
oConn := TFDConnection.Create(nil);
oConn.ConnectionDefName := 'MSSQL_Pooled';
try
oConn.Connected := True; // získá Connection z poolu
-- tady pak s connection pracujeme, tj. používáme ji s Query nebo StoredProc, atd.
finally
oConn.Free; // vráti do ConnectionPool
end;
Demo je v samples Firedacu - tedy něco jako "c:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDConnection\Pooling\" , popis v helpu docwiki.embarcadero.com/RADStudio/XE6/en/Multithreading_(FireDAC). Na uvedeném odkazu jsou dostupné parametry, jako např. max. počet položek v poolu (výchozí je 50) atd.
Datum: 2018-12-16 09:57:00 Tagy: FireDAC