Jak řešit opakující se dotazy do DB?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kejlicz
Člen | 201
+
0
-

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.

David Matějka
Moderator | 6445
+
0
-

to regionSlug se bere odkud?

Felix
Nette Core | 1247
+
+1
-

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.

:-)

kejlicz
Člen | 201
+
0
-

David Matějka napsal(a):

to regionSlug se bere odkud?

Z URL $this->getParameter(„region“)

David Matějka
Moderator | 6445
+
0
-

@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)

kejlicz
Člen | 201
+
+1
-

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

Felix
Nette Core | 1247
+
0
-

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
+
+1
-

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
+
0
-

mkoubik napsal(a):

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íš :-)

Ok :-)

kejlicz
Člen | 201
+
0
-

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
+
+2
-

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
+
0
-

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)