Jak řešit opakující se dotazy do DB?
- kejlicz
- Člen | 201
Ahoj všem
Toto vlákno jsem založil pro potvrzení správnosti postupu.
Pro práci s DB používám Doctrinu2. Pracuji v projektu s regiony. Na stránce je třeba 6 různých komponent, které potřebují pro svoji činnost objekt Region. Psal jsem to stylem, že si každá komponenta sáhne do regionFacade->getRegionBySlug($regionSlug). Teď se snažím projekt optimalizovat a zjistil jsem, že mám v seznamu dotazů např. 6× stejný dotaz, který tahá Region podle url.
RegionFacade je jako služba a přespal jsem to tak, že jsem do regionFacade přidal privátní proměnou actualRegion. Když teď někdo požádá o region, regionFacade se nejdřív podívá, jestli už nemá nastavený actualRegion a pokud jo, vrací ho. Pokud ne, načte data, uloží do actualRegion a vrací je.
Tímto jsem z 6 dotazů, které na localu trvali celkem 30–60ms udělal jeden, který trvá 5–10ms.
Je toto vhodný způsob nebo to u sebe řešíte nějak jinak / líp ?
Díky za názory.
- Felix
- Nette Core | 1247
Bud to resim velmi podobne, ale s tim rozdilem, ze tyhle komponenty maji svuj maly model, kde se to „cachuje“. Protoze si nemyslim, ze by fasada mela mit nejaky svuj vnitrni stav.
A nebo pripadne 1× vytahnu region v presenteru a do vsech komponent ho predavam.
Zalezi hodne na usporadani projektu.
:-)
- David Matějka
- Moderator | 6445
@kejlicz narazel jsem na to, ze to skoro vypada, ze se ten parametr vytahuje z presenteru. a chtel jsem doporucit to, co uz napsal @Felix, tedy
A nebo pripadne 1× vytahnu region v presenteru a do vsech komponent ho predavam.
tim se snizi zavislost komponent na nejakym globalnim stavu a je to transparentnejsi. (avsak je pravda, ze nekde mam take v komponentach zavislost na globalnim stavu)
- Felix
- Nette Core | 1247
kejlicz napsal(a):
Jsem to zkouknul a u 4 komponent si slug předávám v presenteru při tvorbě komponenty a u 2 si „prasecky“ sahám na URL z komponenty.
Přesunu tedy proměnou actualRegion do presenteru a budu předávat do komponent už objekt Region.
Díky
Tak jest spravne. :-)
- mkoubik
- Člen | 728
kejlicz napsal(a):
Jsem to zkouknul a u 4 komponent si slug předávám v presenteru při tvorbě komponenty a u 2 si „prasecky“ sahám na URL z komponenty.
Přesunu tedy proměnou actualRegion do presenteru a budu předávat do komponent už objekt Region.
Díky
A když už budeš u toho, tak to rovnou přejmenuj na
currentRegion
– actual
v angličtině znamená
něco jiného než si myslíš :-)
- kejlicz
- Člen | 201
Ten můj původní systém sice nebyl podle OOP správně, ale fungoval mi
napoprvé :-).
Předělávám to a nějak se v tom zamotávám.
To navrhované řešení, kdy objekt Region získám v presenteru a předám ho
komponentě při vytvoření mi je jasný.
Dál ale potřebuji, aby např. ta komponenta pracovala ještě s RegionFacade
a v tom RegionFacade se opět pracuje s objektem aktuálního regionu. Ten tam
ale už nemám. Jak ho tam dostat?
Nějak se v tom ztrácím. Napadá mě třeba vytvořit nějakou službu, která by v sobě měla ten objekt Region a RegionFacade by si tu službu získala přes DI. Je to cesta nebo je to blbost?
- Tomáš Votruba
- Moderator | 1114
Tyhle případy se v Doctrine řeší krásně elegantně – na interní úrovni pomocí 2nd level cache.
Editoval Tomáš Votruba (11. 7. 2016 23:02)
- kejlicz
- Člen | 201
Tomáš Votruba napsal(a):
Tyhle případy se v Doctrine řeší krásně elegantně – na interní úrovni pomocí 2nd level cache.
Tak jsem si to přepsal tak, že jsem si udělal ObjectManager, tomu v Presenteru v metodě startup() předám object Region a potom si ObjectManager beru pomocí DI tam kde potřebuju.
A můžu se pustit do zkoušení té cache :-)
Díky
Editoval kejlicz (12. 7. 2016 9:39)