webForumDet fria alternativet

Trigga reload på sida då ny data finns i db

.NET

6 svar · 454 visningar · startad av Bjuris

Medlem sedan juli 2001514 inlägg
Frågan#1

Kör med masterpages och tänkte presentera en lista i en contentplaceholder.

Det skall var en lista som lite då och då går ut och kollar mot en tabell i en sql db och presenterar alla svar användaren har fått.

Finns det något sätt att trigga calet mot databasen då det kommer in ett nytt record?
Jag vill ju inte skapa en massa onödig trafik mot databasen med att tex göra en reload på sidan efter varje 30sek som gått.

Typ något liknande som msn messager.

Medlem sedan dec. 19996 522 inlägg
#2

Nej inte direkt något enkelt sätt vad jag kan komma på, du kan knappast köra observerpattern db-c#, möjligt det går att köra mot någon form av service och trigger i dbn och på det viset få observerpattern implementerat. Du kan dock lösa det genom att köra med cache som du har i applikationens scope till skillnad från din databas.

Medlem sedan juli 20011 304 inlägg
#3

Lägg innehållet i cachen och sätt upp en SqlCacheDependency. Om du söker på SqlCacheDependency i google så hittar du exempel.

Medlem sedan dec. 19996 522 inlägg
#4

Dock orsakar ju SqlCacheDependency en poll mot DB, med visst intervall som iof går att ändra

Mer om SqlCacheDependency
http://msdn2.microsoft.com/en-us/library/ms178604.aspx

Medlem sedan maj 20012 812 inlägg
#5

Jag ser 2 problem i det du efterfrågar. :OO

Det först är hur skall din applikation få reda på att något har hänt i databasen.
Här kommer några lösningar. :OO

1. Den enklaste är helt enkelt att du gör en poll var 30 sekund mot databasen och kollar om något har hänt. Om man är nervös för att det skall ta för mycket kräm av databasen, så kan man med hjälp av triggers, ändra i en separat tabell att något har hänt, och sedan kollar man mot den tabellen vad som har hänt, den tabellen kan innehålla: ID på posten, typ av aktion (update,Insert, Delete) och klockslag, samt en lite markering om du har kollat denna post eller ej tidigare.

2. Den andra lösningen som jag ser är att om du kör med SQL 2005 så skall det finnas event från databasen i ADO.NET som du skall kunna lyssna på, hur precisa dessa event är, vet jag inte eftersom jag aldrig har använt dem, men misstänker att du får ett event om något har hänt i en tabell, men att du inte vet riktigt vad. Vilket gör att denna lösning tillsammans med 1 gör att du slipper polla, samt att du vet vad du gjort. (y)

3. Du bygger helt enkelt ett API mot din databas och sköter alla kommunikation mot din databas via detta API, och när du gör förändring någonstans i databasen och går via API:et så kastar API ett event att något har hänt. Här kan du med hjälp av caching lyfta en del last från databasen till en API-services, eftersom denna alltid kan innehålla den senaste informationen i en post, och därför behöver man inte gå ner till databasen och efterfråga informationen. Det kräver dock att ALLA verkligen använder API när man vill göra något i databasen. Säkert riktigt overkill för dig, men rolig och lärande att bygga :birp

Så nu till det tråkiga, och det andra problemet. Alla dessa förslag är helt värdelösa eftersom du kör med ASP.NET och tappar ditt tillstånd vid varje sidanrop. x(
Du kan alltså inte sätta en timer i din kod som gör en kontroll var 30 sekund, utan du måste göra ett anrop till server var 30 sekund på valfritt sätt. Alternativ 2 och 3faller bort eftersom du helt enkelt inte kommer ha någon koppling till databasobjektet som kastar eventet, databasen kommer kasta sitt event, men du har ingen som lyssnar och kan opererar på eventet.

Så hur kan du lösa det smidigast. :q

Du kör alternativ 1, tillsammans med en AJAX-lösning som anropar en webservices som returnerar antigen att det är dags att ladda om sidan när något har hänt, eller ännu bättre allt som har hänt och med hjälp av JavaScript så uppdaterar du dina contentplaceholder med denna information, helt klart snyggaste lösningen. :e

- M

Medlem sedan sep. 200278 inlägg
#6

Är det bara jag som har insett storheten i ASP.NET AJAX? http://ajax.asp.net/

Använd Timer-kontrollen tillsammans med en UpdatePanel så är problemet inte längre ett problem ;)

Jovisst, du måste fortfarande polla mot databasen var n sekund, men du kommer slippa skriva en massa tråkiga AJAX-metoder...

Medlem sedan juli 2001514 inlägg
#7

Det har löst sig kör SQLCacheDependency mot en sql server 2000 (tog ett tag att få det att fungera mot en 2000).
I .NET så har jag en Updatepanel med en Timer som som gör ett anrop mot cachen en gång i minuten.
Ett problem som uppstod var dock att jag blev som vanligt utloggad efter efter 10minuters inaktivitet vilket renderade i att den tappade alla användarinställningar.
Vad jag gjorde då var att sätta en räknare på timern och när den har aktiverats 8gånger så disablar jag den helt enkelt till användaren gör en ny request till någon sida.

265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)