„Cahovat“ pripojenie do DB v prípade neúspechu

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

Zdravím,

po dlhšom čase sa opäť pokúšam zrobiť appku v Nette, ale teraz prv pred tvorbou celkovej aplikácie potrebujem vyriešiť otázku ohľadom ukladania si neúspechu pripojenia do DB a nepokúšať sa pripojiť hneď na ďalší refresh. Prezeral som si dokumentáciu, ale nič som tam ohľadom toho nenašiel, takže to zrejme ani implementované nebude.

Dôvod je, že ak nastane „výpadok“ tak väčšinou máme MySQL server zaťažený a connect trvá dlhú dobu čakajúci na response a keby každý používateľ stále dával refresh spôsobí to, že sa aj web spomalí, lebo ten script beží a ostatné requesty na web sú teda v queue.

Teda moja otázka spočíva, kde a ako by som mal handlovať pripojenie do DB predtým, než sa skôr pripojí a overiť, či napr. pred max 3 minútami sa nemohla aplikácia pripojiť.

Ďakujem za každú radu :).

newPOPE
Člen | 648
+
0
-

No toto je nejaka kravina (je mozne ze nerozumiem otazke). Lebo to ze sa app pripaja k DB pri requeste je normalna vec (a MySQL je na take pripojenia postavena keby nebola tak by to nefungovalo).

Cize by som zacal s tym preco mate MySQL vytazeny. A co mozte urobit pre to aby to tak nebolo teda aby ste zabezpecili to aby tu zataz ustal.

EDIT: a este sa sam seba spytaj ako chces zistit ci je obchod (mysql) zatvoreny ked tam proste neprides (mysql connect) a nezistis to?

Editoval newPOPE (28. 8. 2015 10:51)

Lkopo
Člen | 65
+
0
-

Áno je v poriadku, že sa pripája. Ale ak sa nemôže pripojiť, nech to neskúša aj 50× za sebou lebo používatelia z dôvodu, že niečo nejde to skúsia otvoriť ešte x-krát po sebe, ale automaticky dostane správu, že nie je možné sa pripojiť a po cca 3 minútach sa pokúsi appka reálne pripojiť (ak opäť neúspech, tak sa to znova uloží a o ďalšie 3 min to skúsi znova).

Dôvod zaťaženia môžu byť napr. útoky, ktoré veľmi ovplyvniť nemôžeme a neraz sa nám stalo, že kvôli pomalému pripojeniu do databázy (o ktorej som sa zabudol zmieniť je vzdialená) nám aj celý web „vypadol“, lebo tam bežali stále scripty, čakajúce na odpoveď na vzdialený MySQL server.

Editoval Lkopo (28. 8. 2015 10:55)

newPOPE
Člen | 648
+
0
-

Rozumiem.

Tak kedze nemas DB tak uz ostava len alternativne ulozisko nejakeho countera. Mozno filesystem a inkrementujesa po nejakom cas. limite sa skusis pripojit.

Lkopo
Člen | 65
+
0
-

Práve toto ma napadá, ale netuším, kde mám ten connect do DB upraviť, aby si prv overil či v nejakom napr. txt súbore, kde je uložený čas posledného výpadku, nie je menší ako 3 minúty od súčasného času.

Editoval Lkopo (28. 8. 2015 16:22)

Mysteria
Člen | 797
+
0
-

Tak můžeš použít třeba normálně session ne? Ve více prohlížečích to snad tolik lidí zkoušet nebudou. Při failnutí připojení si zapiš do session čas requestu a pak někde v BasePresenteru se podívej jakej je tam čas a pokud bude menší než X minut, tak si tam napiš nějakou chybovou hlášku a aplikaci ukonči. Pokud jsem to teda pochopil správně a chceš ten „časovač“ pro každého uživatele zvlášť.

Editoval Mysteria (28. 8. 2015 18:35)

Lkopo
Člen | 65
+
0
-

Nie, globálne to myslím, teda pre všetkých používateľov spoločne.

Takto osobitne to stále docieli k tomu, že sa tie požiadavky budú spúšťať aj keď je už vzdialený MySQL server nedostupný.

Jednoduchá non-framework metóda je 1 txt súbor, kde je uložený čas posledného výpadku a proste skript na pripojenie do DB si načíta obsah toho súboru a porovná so súčasným časom. Ak je rozdiel väčší ako 3 minúty, skúsi to znova a ak zase výpadok, tak sa ten čas v txt prepíše aktuálnym.

Editoval Lkopo (28. 8. 2015 19:10)

Unlink
Člen | 298
+
0
-

Toto tvoje overovanie (tak ako v non-framework variante) si môžeš pridať do base presentera, konkrétne do metódy startup.

Lkopo
Člen | 65
+
0
-

A je niekde nejaký návod ako v tej metóde ovplyvniť pripojovanie do DB? V dokumentácii sa mi nepodarilo o tom nič nájsť :/.

Takisto, mám to riešiť klasicky cez fopen, fwrite alebo použiť na to nejakú knižnicu?

Ďakujem za pomoc, postupne sa posúvame k riešeniu.

flr
Člen | 6
+
0
-

Ja bych to osetril v ErrorPresenteru – podivas jestli se vyjimka tyka databaze (napr. ConnectionException), a kdyz jo, tak si ulozis cas kdy k tomu doslo. Ulozit to muzes treba do cache. V BasePresenteru potom tu cache prectes a v pripade potreby ukoncis aplikaci.

Lkopo
Člen | 65
+
0
-

Na ukončenie mám opäť použiť nejaký Exception?

Editoval Lkopo (30. 8. 2015 17:19)