úterý 30. září 2014

Optimalizace komunikace s DB - Kurzory

Komunikaci mezi aplikací a databázovým serverem je možné do značné míry optimalizovat. Technologie FireDAC zpřístupňuje množství parametrů, které upravují způsob, jakým se požadavek zaslaný databázovému serveru bude zpracovávat.
Z hlediska odezvy jsou velmi důležitá nastavení týkající se vytvoření datové sady na serveru a její následný přenos na klientskou stanici.

Volba typu DB kurzoru

FireDAC umožňuje volbu typu kurzoru prostřednictvím parametru "CursorKind".
Parametr "CursorKind" má dopad na:
Čas potřebný pro načtení prvního záznamu výsledkové sady
Čas potřebný pro načtení kompletní výsledkové sady
Možnost současného otevření více kurzorů
Stabilitu (neměnnost) kurzoru
Nároky na systémové prostředky databázového stroje

FireDAC FetchOptions

Dostupné možnosti nastavení jsou:

  • ckAutomatic - Typ kurzoru je vybrán automaticky na základě nastavení ostatních parametrů. 
  • ckDefault - Obsahuje záznamy, které odpovídaly dotazu v okamžiku jeho spuštění. Načtení prvního záznamu může být pomalejší, protože se na klienta přesouvá celá výsledková sada. Celkově je ale rychlejší. 
  • ckDynamic - Dynamický serverový kursor reflektuje změny způsobené aktualizacemi, které proběhly po dobu kdy je kurzor aktivní. Načtení prvního záznamu je rychlé, získání celé výsledkové sady může být pomalejší. 
  • ckStatic - Statický serverový kurzor obsahuje záznamy, které odpovídaly dotazu v okamžiku jeho spuštění.
  • ckForwardOnly - Jednosměrný serverový kurzor. Uvolňuje již použité záznamy, takže šetří paměť. Parametr "Unidirectional" musí být "True".



Příklad Delphi

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Nastavení typu kurzoru na úrovni připojení
  FDConnection.Connected := False;
  FDConnection.FetchOptions.CursorKind := ckStatic;
  FDConnection.Connected := True;
end;

Příklad C++ Builder

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // Nastavení typu kurzoru na úrovni komponenty FDQuery
  FDQuery->Active = False;
  FDQuery->FetchOptions->CursorKind = ckAutomatic;
  FDQuery->Active = True;
}

Způsob práce s kurzorem

Parametr "Unidirectional" určuje, zda se lze v kurzoru pohybovat oběma směry, tedy dopředu i zpět. Standardně je má parametr nastavenu hodnotu "False", kdy je povolen i zpětný pohyb. Pokud je nastaven na "True", šetří se systémové zdroje (již zpracované záznamy jsou uvolněny z paměti), ale například při použití komponenty "DBGrid" vyvolá přesun na předchozí záznam chybové hlášení.

Chyba kurzoru

Uvolnění kurzoru

Databázový stroj udržuje kurzor dokud není datová sada uzavřena, nebo není uvolněn objekt, který je jejím správcem. Parametr "AutoClose", pokud je nastaven na "True", uvolní kurzor ihned po načtení posledního záznamu.

Pozor! Jestliže příkaz vrací více datových sad, musí být tento parametr nastaven na "False", jinak dojde k uzavření kurzoru po načtení všech záznamů první datové sady a další sady již načteny nebudou!