FireDAC a connection pool

vložil Radek Červinka 16. prosince 2018 10:57

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.

Tagy:

Praxe

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců