Jak informovat klienty o změně v tabulce ? – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak informovat klienty o změně v tabulce ? – MySQL – Fórum – Programujte.comJak informovat klienty o změně v tabulce ? – MySQL – Fórum – Programujte.com

 

Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #1
-
0
-

Má MySQL možnost říct klientům, že jeden z nich změnil data v tabulce ?

(Něco jako Notify/Listen v PostgreSQL)

Rád bych, aby refresh tabulky proběhl v aplikaci až když k tomu bude důvod. Což mi přijde rozumnější, než se pravidelně databáze dotazovat.

Děkuji.

Nahlásit jako SPAM
IP: 46.16.121.–
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #2
-
0
-

...tak jsem tady našel vlákno, kde se autor ptá na to samé (i téměř z toho samého důvodu :-) )

http://programujte.com/forum/vlakno/10520-notifikace-aplikace-o-zmene-dat-v-tabulce/

Tam je ale odpověď nedostatečná.

Má někdo jiný nápad ?

Třeba jestli MySQL něco takové umí, tak bych klidně bral možnost, že na dotaz klinta s ID "XY1", odpoví databáze, třeba přes trigger,  ještě konkrétním klientům s ID "XY2" a "XY3" (což uznávám, že se pouštím do spekulace)

Nahlásit jako SPAM
IP: 46.16.121.–
Kit+15
Guru
29. 9. 2013   #3
-
0
-

#2 Luboš
V čem je ta odpověď nedostatečná? Když si uděláš trigger, který při změně inkrementuje nějaký čítač (vzor Observer), tak jednoduchým dotazem, který stejně musí udělat, se dozví i počet nastalých změn.

Pokud chceš skutečně online komunikaci, použij WebSocket.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
29. 9. 2013   #4
-
+1
-
Zajímavé
Kit +

nebo jiny druh databaze... treba redis

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #5
-
0
-

...tak jednoduchým dotazem, který stejně musí udělat, se dozví i počet nastalých změn

Ostatní klientské instance to právě musí vědět dřív, než sami odešlou dotaz. Jinak hrozí konflikt, že odešlou data které už někdo odeslal před nimi, případně se budou dotazovat na data které už neexistují. (když po dotazu zjistím, že jsem střelil naslepo a data již neexistují, je už pozdě)

P.S: o pomoc jsem se obrátil právě proto, že použití jiné databázy bych se chtěl zoufale vyhnout. Aplikace je totiž kompletní a napsaná pro MySQL. Akorát ji musím rozšířit pro více klientů (což mě před tenhle problém postavilo)

Nahlásit jako SPAM
IP: 46.16.121.–
Kit+15
Guru
29. 9. 2013   #6
-
0
-

#5 Luboš
V čem je problém, když se aplikace dotáže na data, která neexistují? Jaký hrozí konflikt, že klientské instance odešlou data, která už někdo odeslal před nimi? Mám takové tušení, že se snažíš řešit problém neřešitelným způsobem. Prostě že máš chybu v návrhu aplikace.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
29. 9. 2013   #7
-
+1
-
Zajímavé
Kit +

podle popisu to zni jako by resil spis "soubeh" (race conditions)

Bez transakci to moc nejde. A jelikoz je to web app, tak transakci pres vicero akci neudelas.

Je moznost pouzit metodu srovnej a prepis - budes mit k dispozici komplet polozku jak byla, srovnas s tim co tam ted je a pokud to sedi tak prepsat.

Nebo mit zamky - tabulku s aktualne editovanymi polozkami ... tam akorat hrozi, ze to nekdo jen tak vypne ci podobne a budes muset resit timeouty.

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #8
-
0
-

problém je předse v tom, že data primárně zpracovává aplikace a databáze je jen úložiště dat/záloha když systém spadne, nebo se comp z jakéhokoliv důvodu vypne.

Aplikace pracuje s několika stovkama "objektů"  kdy je vypíná/zapíná/přenastavuje jejich hodnoty. A vystačí si v zásadě sama, bez databázy. Protože je hala veliká, je požadavek, aby aplikace fungovala z několika míst. A já bych rád databázi, která stejně komunikuje se všemi klientami, rád využil i na tuto "drobnost".

Věř mi, že když změním nastavení jednoho objektu z terminálu č.1, tak to musím vědět co nejdříve, na všech ostatních (rozhodně dřív, než něco z jiného terminálu odešlu) Nemůžu na ostatních klientech jen hádat, které data a na kterém z několika stovek objektů se mi změnili na  terminálu č.XY před 15 minutami.

P.S: já vím, že to jde třeba přímou komunikaci přes TCP/IP.

Ale před tim, než chirurgicky rozpitvám aplikaci, bych rád využil možnosti databáze (proto se ptám na foru MySQL)

Nahlásit jako SPAM
IP: 46.16.121.–
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #9
-
0
-

#7 KIIV
nejde o WEEB aplikaci. Je to napsané v Delphi XE2

Nahlásit jako SPAM
IP: 46.16.121.–
Kit+15
Guru
29. 9. 2013   #10
-
0
-

#8 Luboš
Databáze není jen úložištěm. Zřejmě je informačním základem celé aplikace. Čím víc inteligence do ní vložíš, tím hubenější mohou být klientské aplikace. Nejlepší by bylo, kdyby jako terminály byla úplně hloupá zařízení s nulovou inteligencí.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
29. 9. 2013   #11
-
0
-

#9 Luboš
tak to by ti mohli fungovat ty zamky... pripadne kontrolovat polozky co se zmenily periodicky ... pripadne pokud se zmenilo neco jinyho nez si editoval tak proste zmenit jen cos editoval ty... a pokud se editovalo soucasne tak to oznamit a dat na vybranou?

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #12
-
0
-

#11 KIIV

To všechno mě odkazuje na pravidelný refresh tabulky (byť specializované jen na editované položky). Přípdně ověření předešlých změn při pokusu data editovat. To všechno mi sice zabezpečí správné výsledky, ale druhá možnost mi příliš pozdě aktualizuje stav v terminálu a první (kterou asi chtě nechtě použiju) mě nutí k neustálému dotazovaní na server (řádově každých 1-5 vteřin).


Tak koukám, že MySQL nic jako Notify/Listen, nebo SQLdependency (z MSSQL) neumí. Zatim děkuji za odpovědi. Budu vlákno ještě sledovat, tak kdyby vás ještě něco napadlo, budu rád.

Nahlásit jako SPAM
IP: 46.16.121.–
Kit+15
Guru
29. 9. 2013   #13
-
0
-

#12 Luboš
Potřebuješ řešení typu Observer. Terminály oznámí serveru, které změny je zajímají a když nějaká taková změna nastane, server jim oznámí, že k té změně došlo.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #14
-
0
-

#13 Kit
to zní zajímavě. Zkus to rozvést.

Klienty vždy zajímá UPDATE na kterémkoliv řádku tabulky. Teď mi už jen napráskej, jak databáze zdělí všem klientům, že jeden z nich provedl update, aniž by se tito klienti na to museli ptát.

Nahlásit jako SPAM
IP: 46.16.121.–
Kit+15
Guru
29. 9. 2013   #15
-
0
-

#14 Luboš
Databáze sama to neumí (možná PostgreSQL), ale přes WebSocket by to mohlo jít.

Ještě je možnost přes zmíněný Redis.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Luboš
~ Anonymní uživatel
95 příspěvků
29. 9. 2013   #16
-
0
-

Tak jo. Vzdávám to. Bude to chodit přes opakovaný dotaz na změnu.

Dík za snahu

Nahlásit jako SPAM
IP: 46.16.121.–
peter
~ Anonymní uživatel
4016 příspěvků
30. 9. 2013   #17
-
0
-

Engine innodb umi zamykat tabulku proti editaci jinym uzivatelem.

Zmenu nevim, asi bych ukladal datum (date/timestamp), bud primo k radku nebo do extra tabulky, ze se v te a te tabulce editovalo ten a ten cas. Javascriptem se pak muzes ptat serveru, jestli nastala zmena a kdyz jo, posli nova data.

Server sam o sobe nemuze klientovi rici, ze nastala zmena, protoze je otevreny anonymne vsem. Fakt jedine, jak pisi, spojit pres sockety. Ale to by ti blokovalo server a omezovalo pocet online lidi. Lepsi je anonymne ikdyz casteji, overovat to javascriptem prubezne.

Nahlásit jako SPAM
IP: 193.84.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý