Hej, flera av er har säkert testa att bygga chattar med asp.net. Hej Pelle, Kul att tu tycker jag löst det på "bästa sätt". Men är det verkligen bättre att ligga med en öppen reader och hålla en connection igång mot databasen? Om inte något skrivs på flera timmar, tex nattetid så borde rimligen det vara bättre att som i klassisk asp öppna och stänga så fort det går? Hum, där har du en poäng. Dock kommer laddar ju sidan altid om eler hur? så länge den gör det så hämtar du data från dbn, så det finns väl ingen gång du inte använder din data access? Du bör nog göra ett test, det kan ju vara så att det går bättre att stänga och låta sql poola din conection så att andra kan ta över den, det kan ge bättre prestanda då flera delar på den connection du nyss nyttjade... Så jag tar nog tillbaka det jag skrev. Gör lite prestanda tester på de olika senarierna. Jag hade lagt allt i cachen vilket som med ingen kontakt med databsen, Men om du skall skriva ner allt vajre person skriver så blir det som jag skrev. man cachar alla data tills någon ny har kommit upp, då cachar man igen. Detta för att snabba upp det för folk som hoppar in eller väntar på att en person skall skriva klart sitt mess, vilket kan ta några sec ibland. Hej! Håller med .Patrik, lägg ner det i cachen där du även sätter en expiration time, på typ 10 minuter eller något, då växer inte din cache över gränserna. Magnus Gladh: Japp! Men lite svinn får man räkna med, om man inte vill göra det korrekt :) "Japp! Men lite svinn får man räkna med, om man inte vill göra det korrekt :) Finns ingen anledning att anända weak references med Cachen. Den är redan optimerad för att fungera på bästa sätt för asp.net och HTTP arkitekturen. Dessutom är det här ett fall där man helst skall undvika weak references, då man inte vill tappa data. Patrik: "Skapa ett jobb i SQL Server som använder en Extended proc ( minns inte vad den heter men kan kolla upp det) för att triggra din http handler. " Jag tycker att Sql Server agent kan användas för att schedulera jobb som skall göras regelbundet, Jo kanske. Hur får du SQLen att trigga en Http handler? http://www.gotdotnet.com/team/rhoward/ Här finns ju helt klart optimeringar att göra! Tänk om man ändå kunde trolla lite med tiden och i present så får man en färdig sådan applikation att implementera. Ett annat sätt som är välidgt enkelt att implementera är användandet av CacheItemRemovedCallback. När ett item försvinner ur cachen så kan en callback metod anropas, denna metod kan då spara ner data i databasen om så behövs. Tja det är ju Rob Howard som bygger cachnings funktionerna i asp.net, och hans exempel lägger ju till triggrar och grejjer i sql, så riktigt förvånad blir man ju inte Sist jag pratade med honom, så sa han att det kommer att komma en wizard som gör det möjligt att enkelt sätta upp SqlCachDependency i sitt projekt.Bygga en chat med rätt teknik
Min fråga är vilken teknik som bäst är lämpat för att använda. Idag används iframe som laddar sidan men är säker på att det går att göra på andra sätt. Berätta gärna om era erfarenheter eller ge länkar på exempel som är rätt "tänk". Chatten är som idag tänkt att skriva och hämta data från databasen.
Det finns två parameter som är mycket viktiga. Dels skall chatten fungera i samtliga webbläsare, dels inte flimmra på skärmen vid uppdatering och slutligen att chatten är stabil och inte hackar. Under 1 månad görs ca 3.000.000 anrop till databasen så det är hög kvalité och precision som krävs.
Tack på förhand.Sv: Bygga en chat med rätt teknik
Jag tror du redan valt att bygga den på det bästa sättet när det handlar om web, se bara till så den är migrerad till .Net bara.
Jo se till att använda en Reader och inte DataSet. Försök återanvända den connection som är öppen så mkt som möjligt. så du inte öppnar och stänger en ny vid varje refresh.
Mvh JohanSv: Bygga en chat med rätt teknik
Sv: Bygga en chat med rätt teknik
Du kan även öka prestandan genom att inte hämta viss data, vet ej hur du gör nu med datum o namn? är det något du sparar ner o hämtar o visar? eller är detg typ data från sessioner? Tänker främst på namnet. Om inte kan du ju lägga namnen i en session, datumet med datetime.now typ och bara plocka texten, vilket ger en midre fråga mot dbn.
Sedan kan du göra en dyn refresh hantering, d vs. ju mer folk som nyttjar chatten ju längre tid får man vänta på en refresh. ex är det över 20-30 pers kör du refresh var annan sekund istället för varje. Detta skulle ge minskad seghet och ge snabbare svar då det belastningen skulle sega ner mer än 2 sec trotts att du har en 1 sec refresh, är du med?
Kör du med blobs? text typen i SQL servern? om du gör det kör istället nVarchar och sätt en input begränsning på x antal tecken. Detta ger oxå ökad prestanda. Just blobbar slöar ner en hel del. Indexering på hämtningen gör du eller? om du gör det kanske du skall ta bort den, för indexering på tabeller som gör mkt updates eller inserts kan ge fel effekt, det kan då gå slöare vid hämtning m.m. :-(
Om du vill göra det knöligare kan du ju alltid lägga den data du hämtar i en cache, och presentera den cachade datan så länge ingen skriver något. det gör att refreshen slipper gå mot dbn o bara nyttja cachen, så fort ny data åker in uppdaterar du bara cachen, på så vis för du ändå din historik. när alla 20 gör en refresh ex samtidigt o ingen har skrivit något nytt slipper du gå mot databasen.
Ja det var väl några till tips som kanske kan hjälpa till lite,
Mvh JohanSv: Bygga en chat med rätt teknik
och då menar jag hela chatten allså ingen hämtning från dbn vad gäller at visa chatten för användarna.
Är det så att du måste spara ner vad folk skriver av ngt skäl, så kan du alltid låta sql köra ett jobb som triggrar en nedskrivning av cachen till dbn.Sv: Bygga en chat med rätt teknik
Bästa vore att bara köra cahce och logga datan när chatten är avklarad. Eller var 10:e minut eller nått. Dock kan inte andra följa det som sades för x antal radersedan förrän efter en längre tid. Men det skulle gå mkt mkt snabbare då.
Mvh JohanSv: Bygga en chat med rätt teknik
Min erfarenhet är att Flash (av alla program på denna jord) faktiskt är rätt bra när det gäller att hämta data ganska ofta. Fungerar faktiskt förvånansvärt bra när jag har testat och framförallt så slipper man skicka lika mycket data (eftersom det endast är meddelanden och ingen design) mellan servern och klienten och det är ju inte fel...
//KalleSv: Bygga en chat med rätt teknik
Du kan om du inte vill ha någon expiration time, istället använda dig av weak referens som fungerar extremt bra vid just caching.
- MSv: Bygga en chat med rätt teknik
Weak references, kan vara bra att använda i "cache" sammanhang, dock så vet vi inte när GC:n kör finalize på objekten. Detta kan leda till att skrivna meddelanden plötsligt försvinner.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Bygga en chat med rätt teknik
- MSv: Bygga en chat med rätt teknik
"
Då anser jag att det inte är korrekt...
Mvh JohanSv: Bygga en chat med rätt teknik
Expiration och sliding expiration sköter det där fin fint.
Så Pelle, jobba från cachen hela tiden, skriv dit och läs därifrån, blanda aldrig in databasen från användarsidorna.
Behöver du verkligen historiken? I så fall tycker jag du gör som jag föreslog och skriver ett SQL Job i SQL Agent, som helt enkelt hämtar datat från cachen och skriver ner det, då behöver du aldrig blanda in de sidor som användarna ser, utan det sköts bakom kulisserna.
-[Edit: Formaterade texten, lade till prylar ]-
Förslag på lösning,
Skapa en datatable eller ett dataset ( om du tex vill joina in användarna ), hål lalltid de sista 20 raderna som är skrivna i chatten i datatabeln. Cacha datat. Låt den ha CacheExpiration på 20min och en sliding expiration på 5. (dvs varje gång ngn skriver ngt så skjuts cache expiration frammåt)
Skriv en http handler som, när den triggras, läser av datat i cachen och uppdaterar databasen med den infromationen.
Skapa ett jobb i SQL Server som använder en Extended proc ( minns inte vad den heter men kan kolla upp det) för att triggra din http handler.
Det gör att användaren aldrig behöver vänta på att du uppdaterar databasen bla.Sv: Bygga en chat med rätt teknik
>Finns ingen anledning att anända weak references med Cachen.
Om du menar Cache objektet i ASP.Net så håller jag med dig.
Men om du syftar på en egen "implementerad" cache, så håller jag inte med till 100%, självklart beror det på cachens syfte och vad den ska användas till.
(Varför tänker jag inte ta upp här! Det får bli en annan tråd för den diskutionen)
-----------------------------
OBS! Cachen (Session är inte inräknad) i ASP.Net fungerar inte i en Web Farm.
Om chatten ska installeras i en Web Farm, använd då tex en databas för att temporärt lagra meddelanden (Finns andra lösningar, men jag anser att databas är den variant som blir enklast att implementera).
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Bygga en chat med rätt teknik
Du tycker alltså att Datakällan skall känna till överliggande logik?
Mvh JohanSv: Bygga en chat med rätt teknik
tex som i det här fallet då man exekverar en custom http handler som i sin tur skriver ner cachen till dbn, istället för att tvinga ngn stackars användare att göra det .Sv: Bygga en chat med rätt teknik
Mvh JohanSv: Bygga en chat med rätt teknik
plocka ner "ASP.NET Cache Invalidation on Database Change"
Bygger du om http handlern, så kan den spara data istället för att bara döda cachen.Sv: Bygga en chat med rätt teknik
Stort tack för ert engagemang, här måste grottas ser jag..Sv: Bygga en chat med rätt teknik
exempel på hur CacheItemRemovedCallback kan implementers:
<code>
CacheItemRemovedCallback onRemove = null;
public void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
//Spara ner value till databasen
}
public void AddItemToCache(Object sender, EventArgs e)
{
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
if (Cache["myKey"] == null)
Cache.Add("myKey", "myValue", null, DateTime.Now.AddSeconds(3600), TimeSpan.Zero, CacheItemPriority.High, onRemove);
}
....
}
</code>
Detta hör inte riktigt hit men i ASP.Net 2.0 så kommer det helt nya cache-tekniker med notifierierngar som kan tömma cachen mm. Detta görs tex med SqlDependency klassen. .Net 2.0 lägger till en trigger i en tabell som man själv får specifier. Om något ändras i den tabellen så utförs triggern (triggern lägger till data i en notifieringstabell). Notifieringstabllen läses av med hjälp av polling genom att en ny tråd skapas av SqlDependency klassen. När förändringar sker i tabellen så rensas cachen.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Bygga en chat med rätt teknik
Sv: Bygga en chat med rätt teknik
Övrigt för er som inte vet och är nyfikna på ASP.Net 2.0, så kommer det andra saker som tex Post-Cache Substitution och möjligheten att bygga sina egna CacheDependency etc.
/Fredrik Normén NSQUARED2
http://www.nsquared2.net