ASP.NET QuickStart Príručka
SQL Cache Invalidation Nové v 2.0
V predošlom príklade boli dáta cachované po dobu 60 sekúnd, nezávislé na tom, či
údaje v databáze boli zmenené. SQL cache invalidation Vám umožňuje spraviť cachovanú
položku závislú na databáze tak, že cachovaná položka bude vymazaná len vtedy, keď
budú dáta v databáze zmenené.
Polling-based Invalidation
Tento mechanizmus používa zhromažďovanie dát (polling) ako kontrolu, či bola tabuľka
aktualizovaná od cachovania stránky. Povolenie cachovania založeného na tabuľkách
si vyžaduje nasledujúce kroky:
|
1) |
Povolenie prihlásenia pre databázy použitím nástroja aspnet_regsql.exe.
>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -ed
Tento krok je potrebné spraviť pre každú databázu len raz.
|
|
2) |
Povolenie prihlásenia pre tabuľku(y), na ktorých chcete využívať závislosti, použitím
nástroja aspnet_regsql.exe.
>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -et -t "authors"
|
|
3) |
Registrovanie prihlásenia v nastaveniach aplikácie.
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000" >
<databases>
<add name="PubsDB" connectionStringName="Pubs" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
Poll time určuje ako často aplikácia kontroluje zmenu dát.
|
|
4) |
SQL závislosti môžu byť potom použité v direktíve OutputCache:
<%@ OutputCache Duration="999999" SqlDependency="Pubs:Authors" VaryByParam="none" %>
Alebo určené priamo v ovládacích prvkoch datasource:
<asp:SqlDataSource EnableCaching="true" CacheDuration="Infinite" SqlCacheDependency="PubsDB:Authors" ... />
|
Nasledujúci príklad využíva cachovanie výstupu pre SQL dátový zdroj použitím hlásení
založených na tabuľkách. Pozorujte časovú známku (timestamp) na spodnej strane aplikácie,
ktorá by mala ostať statická. Na editáciu dát môžete použiť príklad s GridView. Obnovenie stránky by potom malo zobraziť
aktualizované údaje a novú časovú známku (timestamp).
VB SqlCacheDependency
Sql Server 2005 Notification-based Cache Invalidation
Tento mechanizmus používa mechanizmus hlásení o zmene dotazov Sql Servera 2005 na
objavenie zmien do výsledkov dotazov. Na rozdiel od polling based invalidation pre
Sql Server 7.0 a 2000 tento typ vyžaduje o mnoho menej nastavení.
- Na rozdiel od polling based validation nie je potrebné registrovať
<sqlCacheDependency>
v nastaveniach Vašej aplikácie. Okrem toho sa nevyžaduje žiadne špeciálne nastavovanie
pomocou nástroja aspnet_regsql.exe .
- Závislosť založená na hláseniach je konfigurovaná v direktíve OutputCache použitím
reťazca CommandNotification. Táto hodnota ukazuje ASP.NET, že závislosť založená
na hláseniach by mala byť vytvorená pre stránku alebo ovládacie prvky datasource.
V stránke:
<%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %>
V ovládacom prvku datasource:
<asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... />
- Metóda System.Data.SqlClient.SqlDependency.Start() musí byť zavolaná v aplikácii
pred spustením prvého SQL dotazu. Táto metóda môže byť uložená do udalosti Application_Start()
v súbore global.asax .
Vždy keď je príkaz vydaný na Sql Server 2005, ASP.NET a ADO.NET automaticky vytvoria
závislosť vyrovnávacej pamäte, ktorá dáva pozor na hlásenia o zmenách odoslané z
Sql Servera. Ak sú dáta na Sql Serveri zmenené, tak tieto hlásenia zapríčinia to,
že cachované dotazy na webovom serveri sa stanú neplatnými. Keď je najbližšie vyžiadaná
stránka alebo ovládací prvok datasource združená so závislosťou, bude stránka alebo
ovládací prvok datasource spustený opätovne ako aj slúžiaci cachovaným informáciam.
Bežné problémy zabraňujúce dotazom pracovať s hláseniam o dotazoch Sql Servera 2005
sú:
- Dotazy musia explicitne obsahovať v údaji SELECT (SELECT statement) názvy stĺpcov.
Požitie "SELECT *" bude mať za následok dotaz, ktorý nebude registrovaný hláseniami
o dotazoch Sql Servera 2005.
- Názvy tabuliek v dotazoch musia obsahovať meno vlastníka. Napríklad ak vydáte dotaz
na tabuľku authors v lokálnej databáze (pubs database), musí sa dotaz odvolávať
na tabuľku pod "dbo.authors".
- Identita bezpečnosti (security identity) prevádzkujúca dotaz musí mať práva registrovať
dotazy pre hlásenia v Sql Serveri 2005. Toto právo môže byť pridelené nasledujúcim
T-SQL príkazom:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO username.
- Identita bezpečnosti (security identity) prevádzkujúca dotaz musí mať takisto práva
odosielať hlásenia o dotazoch z Sql Servera 2005. Toto právo môže byť pridelené
nasledujúcim T-SQL príkazom:
GRANT SEND ON SERVICE::SqlQueryNotificationService
TO username.
Poznámka: Existuje mnoho obmedzení v syntaxe dotazov, ktoré podporujú hlásenia
o dotazoch. Pre zoznam týchto špeciálnych obmedzení si prosím prezrite tému "Vytváranie
dotazov o hláseniach (Creating a Query for Notification)" na Sql Server 2005 Books
Online. Takisto ak vyjde najavo, že dotazy nie sú cachované, ale namiesto toho sú
spúšťané pri každej požiadavke, buď dotaz nespĺňa obmedzenia požadované Sql Serverom
2005, alebo Sql Server 2005 vygeneroval chybu pri pokuse o nastavenie hlásení pre
dotaz. Práve každý z týchto prípadov zapríčiňuje tichý neúspech pri pokuse o nastavenie
závislosti vyrovnávacej pamäte v ASP.NET, s výsledkom, že závislosť vyrovnávacej
pamäte je vždy neplatná, a preto sú všetky združené dotazy spustené pri každej požiadavke.
|