Aktualizace změn v databázi do klientů
Ahoj,
potřeboval bych poradit, jak nejlépe a nejefektivněji refreshnout data v klientském programu (napsán v C#).
Mám databázi (MySQL) s několika tabulkami a desktopového klienta, kterého ovládá uživatel, který s daty pracuje - přidává/maže/upravuje (data se okamžitě promítají do databáze). Doteď byl klient využíván z jednoho místa, tudíž data byla přímo synchronizována a aktuální.
Nyní se ale s daty bude pracovat z dvou míst a proto bude potřeba mít data v obou klientech aktuální. Když něco změním/přidám v místě 1, musí to být vidět i v místě 2 nejlépe automaticky a okamžitě.
Jak toto nejlépe vyřešit? Nastavit nějaký interval (10 vteřin?) během kterého se vždy stáhnou tabulky, ve kterých nejčastěji dochází ke změnám? Nebo přidat nějaké tlačítko, které bude dělat to samé, akorát manuálně? Nebo lze nějak "poslouchat" změny v databázi a pak provést nějaké příslušné úkony?
Díky za rady a zkušenosti.
Nelze.
Oba klienti jdou do stejné databáze přímo? Nebo přes nějaký server?
Taky budeš muset řešit zamykání záznamů. Aby nemohli oba klienti měnit stejný záznam.
http://stackoverflow.com/questions/129329/optimist ic-vs-pessimistic-locking
Přímo? Mám hosting s MySQL serverem a databází o 4 tabulkách a z C# se na něj připojuji klasicky přes MySqlConnection...
Zamykání jo? To je nastavení toho MySQL serveru ale, ne?
Ne, přečti si odkaz, který jsem sem dal.
Proč se musí data, na obou klientech refreshovat automaticky? Nestačí dát do klienta tlačítko refresh? Ať si user sám rozhodne, kdy si data refreshne.
EDIT: Pokud to chceš, fakt automaticky, tak nejlepší řešení je dát před databázi server, kterému se budou ostatní klienti připojovat. Při zápisu do DB některým z klientů, pak server uvědomí ostatní klienty, že si mají refreshnout data.
To už asi ne, vyřešil bych to tím manuálním refreshem přes tlačítko.
Mozes si vytvorit specialnu tabulku a do nej ukladat datum poslednej modifikacie, najlepsie pre kazdu tabulku zvlast.
Pri zapise okrem beznych dat zapises do tej specialnej datum a cas a zaroven si to zapamatas aj na klientovi.
A potom si klient kazdych par sekund porovna svoj posledny zapis s tym co je v DB. Ak sa nezhoduju, stiahnes tabulku.
Takto zabranis, aby sa ti tahali kvanta dat aj ked neboli vobec zmenene.
Buď nebo teď mi napadlo, udělat si tabulku s 4 boolean hodnotami (mám 4 tabulky v DB) a jakmile provedu v nějaké změnu, nastavím boolean na true, druhý klient se bude třeba po 10 vteřinách dotazovat na tyto booleany a pokud nějaký bude true, stáhne tabulku, ve které došlo ke změně a boolean nastaví na false.
Klient který data odeslal první by přece pořád viděl True a pořád nastavoval False.
Problém je, že uživatel vytváří nová data, a najednou se mu tabulka aktualizuje, naskočí jeho záznam upravený a data jsou v tahu, určitě by se tomu dalo zabránit, ale v takových situacích je to stejné jako u Version systémů (SVN, Git), musíš si dávat pozor jestli data někdo neodeslal/upravil před tebou a ty mu nezničíš jeho práci.
Naozaj potrebuješ obnovovať dáta v reálnom čase? V 99 % prípadov stačí obnovovať dáta len vtedy, keď si to používateľ explicitne vyžiada. Plus pri ukladaní do databázy kontrola, či neboli údaje medzičasom aktualizované niekým iným.
Ok, takže jak už i MaSo psal, přidat nějaké tlačítko, které refresh provede...