02. juni 2004 - 19:34Der er
27 kommentarer og 2 løsninger
ASP application variables
Jeg skal lige har bekræftet/afkræftet en række ting. Det drejer som om data som ca. 100 klienter skal kunne tilgå samtidig. Jeg går udfra at flere klienter kan læse fra en application variable samtidig, eller hvad? Kan der være problemer med at ændre værdien, hvis flere 100 klienter bruger den? Er det noget andet der er hurtigere end application variables? Hvad med cache objektet?
application["et eller andet"] er der jo netop for at kunne gemme nogle ting hele applikationen skal kunne se, så det må være den mest rigtige at bruge
ang. dine hundrede brugere, så sørg for at lave en Lock på din variabel før du ÆNDRER den. Det er ikke noget problem at læse variablen, også selvom der er 34 der gør det samtidig.
jeg spørger, da jeg er nysgærrig, og havde den opfattelse at så længe man ikke ændrer ved data, bare aflæser dem, så er der mange der kan gøre det på samme tid uden at der burde ske noget
Jeg skal f.eks have et array af data for 100 forskellige land. Array består af en streng på ca. 1000 tegn. Værdien skal tilgås således
string data = arrData[landeid];
Typisk bliver der, via et administrationsmodul, kun ændret en lande streng adgangen. Måske de skulle ligge i hver deres applications variable? Et array af applikations variabler af typen string?
Så skal arrayet selvfølgelig også være en applikationsvariable.
Kan man have et array som er en applikationsvariable, som indeholder strenge, som også er applikationsvariable? Så kan man vel nøjes med at låse den plads der skal ændres, eller hvad?
Når man låser på et objekt forhindrer man ikke andre i at opdatere objektet - man forhindrer kun andre i at få lås på objektet.
D.v.s. at alle som skal synkroniseres skal låse.
Og det er derfor også ligegyldigt om man låser på det objekt der skal ændres eller man låser på et helt andet objekt. Bare alle låser på det samem objekt, så virker det fint. Det giver selvfølgelig mest læsbar kode at låse på det man skal beskytte mod samtidige rettelser.
Jeg har lige et sidste spm. Jeg har som sagt mange klienter der tilgår samme data. Jeg havde forstillet mig at hvis applikations varaiblen er tom, så slås den op i en database. Dette kan dog tage lang tid, og jeg ønsker ikke at flere klienter/tråde gør det samtidigt. Kun den første. Er det muligt at gøre noget ala dette pseudo-kode? Eller findes der en mere snedige (læs performance-venlig) måder at gøre dette på?
if (application["test"]=="") { if (!application["test"].isLocked()) { application["test"].lock(); application["test"] = getDataFromDatabase(); application["test"].unlock(); } else while (application["test"]=="") sleep(100); }
:) Ja, den er købt! Den giver mulighed for samtidig læsning. Og den 100% sikre må vel være:
string test = application["test"]; if (test==application["test"]) { application["test"].lock(); if (application["test"]=="") { application["test"] = getDataFromDatabase(); } application["test"].unlock(); test = application["test"]; }
string test = application["test"]; if (test=="") { application["test"].lock(); if (application["test"]=="") { application["test"] = getDataFromDatabase(); } application["test"].unlock(); test = application["test"]; }
For der vel en teoretisk mulighed for at applikations variablen er tom efter.
if (application["test"]=="") { application["test"].lock(); if (application["test"]=="") { application["test"] = getDataFromDatabase(); } application["test"].unlock(); }
Faktisk skal det vel være:
string test = application["test"]; if (test=="") { application["test"].lock(); if (application["test"]=="") { application["test"] = getDataFromDatabase(); } test = application["test"]; application["test"].unlock();
}
Men jeg takker da for en givtig tråd. Lukker en anden dag.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.