602SQL-Úplná dokumentace Index  

Synchronizace klienta s událostmi na serveru

V typickém modelu spolupráce klient zasílá své požadavky na server a dostává od něj odpovědi nebo zprávy o chybách. Nástroje pro synchronizaci klienta a serveru dovolují rozšířit tento model. Klient může být informován o událostech, které na serveru nastávají jako důsledek činnosti ostatních klientů, například o změně v datech v určité tabulce nebo provádění určité procedury.

Princip synchronizace

Jeden výskyt události ovlivní tedy všechny klienty, kteří mají tuto událost registrovanou.

Synchronizace a vlákna

Když klient čeká na událost, je čekající vlákno zablokováno. Proto pokud klient chce během čekání provádět jinou činnost, musí mít víc vláken. Pokud chce během čekání komunikovat se serverem (například provádět databázové operace nebo přerušit čekání na událost), musí se další vlákno také přihlásit na server.

Přihlášení dalšího vlákna ze stejného procesu na server nespotřebuje další licenci.

Označování událostí

Událostí se označují jménem s maximální délkou 31 znaků. Na klientské straně jsou registrované události označené také číslem nazývaným handle události.

Jméno události se uvádí při registraci události a při vyvolávání události. Prostor jmen událostí je společný pro všechny klienty. Proto pokud nemají interagovat událostí nastávající v různých aplikacích provozovaných na stejném serveru, je vhodné, aby jména měla prefix specifický pro aplikaci.

Handle události je klientovi přidělen při registraci události. Handle je vrácen při úspěšném ukončení čekání na událost. Používá se také při odregistrování události.

Pro událost stejného jména mají různí klienti různé handle. Pokud si klient registruje stejnou událost opakovaně, získá různé handle.

Události a transakce

Pokud klient vyvolá událost, ta nastane až při ukončení jeho transakce. Je-li transakce odvolána (explicitně nebo implicitně v důsledku chyby), pak událost nenastane - její vyvolání nebude mít žádný efekt.

Parametry událostí

Při vyvolání události lze uvést parametry události ve formě řetězce znaků. Tyto parametry obdrží klient čekající na událost.

Při registraci události lze uvést požadovanou hodnotu parametrů. Výskyty události, které tomuto požadavku nevyhoví, jsou ignorovány.

Požadavek na hodnotu parametrů může mít dvě podoby:

Při porovnávání parametrů se ignoruje velikost znaků.

Klient si může stejnou událost zaregistrovat vícekrát, s různými (nebo i se stejnými) požadavky na parametry. Při výskytu události s odpovídajícími parametry každé registraci bude odpovídat úspěšné ukončení jednoho čekání.

Globální a lokální událostí

V některých případech je třeba, aby výskyt události v jedné aplikaci byl zaznamenán klientem pracujícím v jiné aplikaci. V jiných případech je takové chování nežádoucí, například tehdy, když na jednom serveru nezávisle pracuje více instancí stejné aplikace.

Proto bylo zavedeno rozlišení událostí na globální a lokální. Výskyt lokální události zaznamená pouze klient, který má během commitu události nastaveno stejné schéma, jako klient vyvolávající událost. Výskyt globální události mohou zaznamenat všichni klienti, kteří si ji zaregistrovali.

Jméno lokální události začíná znakem @, jméno globální události začíná znakem jiným než @.

Vícenásobný výskyt událostí

Čekání na událost vrací také počet výskytů událostí. Čekání sice končí prvním výskytem, počet výskytů větší než jeden však může být vrácen v těchto případech:

Pokud událost nastane opakovaně s různými hodnotami parametrů, pak se tyto výskyty nesčítají. Jednotlivé hodnoty parametrů klient získá opakovaným voláním funkce pro čekání na výskyt.

Pokud klient má zaregistrovanou určitou událost, pak má také povinnost čekat na její výskyt, a to s takovými požadavky na parametry, aby byl o výskytu události uvědoměn. V opačném případě by se na serveru hromadily informace o výskytu události.

Funkce pro práci s událostmi

V klientském rozhraní jsou k dispozicí funkce: cd_Register_event a cd_Unregister_event pro (od)registraci události, cd_Wait_for_event, cd_Cancel_event_wait pro čekání a přerušení čekání na událost.

V jazyce SQL je na serveru k dispozici funkce Invoke_event pro vyvolání události.

V CDK balíčku existuje zapouzdřující komponenta TSQL602EventAction.