Avatar billede sbpweb.dk Nybegynder
16. august 2008 - 22:51 Der er 6 kommentarer og
1 løsning

Application.Lock ifm. online brugere uden global.asa

Jeg har et par spørgsmål/brug for et råd.

Jeg vil bruge nedenstående kode (hentet fra http://www.aspfree.com/c/a/ASP-Code/Active-User-Count-Without-Globalasa-by-Josh-Painter/) til at tælle antal online brugere, for at undgå at bruge global.asa. Koden skal indsættes som en include i starten af alle mine sider.


'--- Start på kode ---
<%
Sub LogActiveUser
            Dim strActiveUserList
            Dim intUserStart, intUserEnd
            Dim strUser
            Dim strDate

            strActiveUserList = Application("ActiveUserList")

        If Instr(1, strActiveUserList, Session.SessionID) > 0 Then
            Application.Lock
            intUserStart = Instr(1, strActiveUserList, Session.SessionID)
            intUserEnd = Instr(intUserStart, strActiveUserList, "|")
            strUser = Mid(strActiveUserList, intUserStart, intUserEnd - intUserStart)
            strActiveUserList = Replace(strActiveUserList, strUser, Session.SessionID & ":" & Now())
            Application("ActiveUserList") = strActiveUserList
            Application.UnLock
        Else
            Application.Lock
            Application("ActiveUsers") = CInt(Application("ActiveUsers")) + 1
            Application("ActiveUserList") = Application("ActiveUserList") & Session.SessionID & ":" & Now() & "|"
            Application.UnLock
        End If
End Sub


Sub ActiveUserCleanup
Dim ix
Dim intUsers
Dim strActiveUserList
Dim aActiveUsers
Dim intActiveUserCleanupTime
Dim intActiveUserTimeout

intActiveUserCleanupTime = 1 'In minutes, how often should the ActiveUserList be cleaned up.
intActiveUserTimeout = 20 'In minutes, how long before a User is considered Inactive and is deleted from ActiveUserList

If Application("ActiveUserList") = "" Then Exit Sub

If DateDiff("n", Application("ActiveUsersLastCleanup"), Now()) > intActiveUserCleanupTime Then

    Application.Lock
    Application("ActiveUsersLastCleanup") = Now()
    Application.Unlock

    intUsers = 0
    strActiveUserList = Application("ActiveUserList")
    strActiveUserList = Left(strActiveUserList, Len(strActiveUserList) - 1)

    aActiveUsers = Split(strActiveUserList, "|")

For ix = 0 To UBound(aActiveUsers)
    If DateDiff("n", Mid(aActiveUsers(ix), Instr(1, aActiveUsers(ix), ":") + 1, Len(aActiveUsers(ix))), Now()) > intActiveUserTimeout Then
        aActiveUsers(ix) = "XXXX"
    Else
        intUsers = intUsers + 1
    End If
Next

strActiveUserList = Join(aActiveUsers, "|") & "|"
strActiveUserList = Replace(strActiveUserList, "XXXX|", "")

    Application.Lock
    Application("ActiveUserList") = strActiveUserList
    Application("ActiveUsers") = intUsers
    Application.UnLock

End If

End Sub


Call LogActiveUser()
Call ActiveUserCleanup()

Response.Write "There are " & Application("ActiveUsers") & " active users currently online."
%>
'--- Slut på kode ---


Mit spørgsmål er: Er det ikke bedst at låse Application objektet med Application.Lock mens hele sub'en afvikles, og altså ikke kun i dele af den, som i ovenstående kode?

Eksempel:
I sub'en "ActiveUserCleanup" indlæses Application-variablen "ActiveUserList" ind i den lokale variabel "strActiveUserList". Der ryddes op i den lokale variabel og denne læses tilbage i Application-variablen.
Burde Application ikke låses under hele denne proces? Mens der ryddes i den lokale variabel (hos bruger A), kunne en anden bruger (bruger B) jo køre scriptet og tilføje noget til Application-variabelen. Når så bruger A indlæser sin lokale variabel i Application-variablen, så mistet den information som bruger B lige har tilføjet.

Har jeg ret? Vil det ikke være mest sikkert at låse Application-objektet under hele sub'en? Jeg spørger fordi jeg er meget i tvivl om dette.

Vil det sløve et site meget og give lange ventetider at låse Application objektet mens en hel sub køres?
Avatar billede softspot Forsker
16. august 2008 - 23:48 #1
Jeg er fuldstændig enig med dig i at Application.Lock bør kaldes inden værdien aflæses, hvis der skal sikres mod overskrivning af evt. ændringer som du selv beskriver.

Hvorvidt det sløver... tjaah, det er jo aldrig godt for skalérbarheden at tage en eksklusiv lås på en central enhed i et system, så hvis du forventer at det skal være et travlt site, kan det da godt give problemer (der er kun én "bruger" i HELE applikationen, som kan lave noget mens låsen er aktiv!). Såvidt jeg kan forstå vil denne rutine blive kørt hver gang en bruger laver et request, så applikationen vil nok hurtigt blive langsom for en masse brugere...

Umiddelbart ville jeg vælge en database til at holde styr på dette. Selvom en databaseforbindelse er langsommere end applikationsobjektet, så kan flere typisk køres parallelt (hvis det ikke lige er access) og den enkelte bruger vil derfor kun mærke en mindre forsinkelse og serveren vil blive udnyttet meget bedre end hvis alle brugere skulle stå i én kø for at komme igennem.

Et andet alternativ er at bruge et Free Threaded XMLDOM, hvori du kan vedligeholde session-aktivitet parallelt. Free Threaded XMLDOM er langsommere end en normal XMLDOM, men trods alt nok hurtigere end en database. Men du slipper i det mindste for database-forbindelsen ved hver request...
Avatar billede sbpweb.dk Nybegynder
17. august 2008 - 14:52 #2
Ok. Mange tak for dine kommentarer!
Jeg har aldrig hørt om "Free Threaded XMLDOM", og synes ikke der er meget hjælp at hente når jeg Googler det. Har du evt. et link hvor jeg kan finde noget mere information?
Avatar billede softspot Forsker
17. august 2008 - 17:21 #3
Der er lidt hits på "FreeThreadedDOMdocument".

Det er i bund og grund det samme interface som Msxml2.DOMdocument, bare med den forskel at det altså er threadsafe, dvs. der burde ikke være nogen problemer i at DOM'en læses og ændres af flere processer på samme tid.
Avatar billede softspot Forsker
28. august 2008 - 23:50 #4
Er du kommet videre med denne?
Avatar billede sbpweb.dk Nybegynder
29. august 2008 - 07:48 #5
Sorry. Jeg havde simpelthen glemt denne post.
Jeg løste det med at bruge databasen til at holde styr på online brugere. Men det hele er endt med at vi nu bruger global.asa alligevel.

Men mange tak for din hjælp, som jo besvarede mine spørgsmål. Smider du et svar, så jeg kan give dig point?
Avatar billede softspot Forsker
29. august 2008 - 08:51 #6
Velbekomme :)
Avatar billede softspot Forsker
29. august 2008 - 09:18 #7
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester