Avatar billede 3z Nybegynder
19. november 2007 - 21:55 Der er 11 kommentarer

Sessions eller databaseudtræk

Jeg har et onlinesystem i ASP med Access database, hvor jeg ved login, gemmer følgende sessions:
Session("User") , som er brugerens id i database.
Session("Level") , som er brugerens rettigheder i systemet.
Session("Language") , som er brugerens sprogvalg.

Jeg bruger den første til at tjekke om brugeren er logget ind, mens de to andre oplysninger bruges til at definere, hvilke dele af systemet brugeren må se samt hvilket sprog siden skal vises i.

Jeg oplever desværre at systemet hænger jævnligt. Dvs der kan gå op til et minut hvor siden nede i statuslinien bare meget meget langsomt indlæses og pludselig er den ok igen. Jeg har et andet lignende system på samme webserver, som ikke har disse problemer og jeg vil nu undersøge hvorfor dette system ofte hænger.

Mit spørgsmål er nu om brugen af disse sessions er hurtigere/langsommere at afvikle fremfor, at lave et databaseudtræk på hver side, som tjekker brugerens rettigheder og sprogvalg ? Jeg har f.eks. i headeren på alle sider en if sætning, som tjekker brugerens rettigheder i den angivne session, for at afgøre om et menupunkt må vises eller ej. Kan dette med fordel laves som et udtræk af databasen eller giver det ingen forskel ?
Avatar billede keysersoze Guru
19. november 2007 - 22:18 #1
Sessions ligger i serverens hukommelse og det er alt andet lige hurtigere at arbejde der end at lave opslag i en database - så umiddelbart vil du gøre det langsommere ved at fjerne de to sessions og slå op i databasen på hver side.
Avatar billede 3z Nybegynder
19. november 2007 - 22:29 #2
Har faktisk lige leget med nogle timestamps forskellige steder i koden. Til min store overraskelse er det ved selve databaseforbindelsen scriptet bruger længst tid:

    'Åben databaseforbindelsen
    set Conn = Server.CreateObject("ADODB.Connection")
    DSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../../database/DB.mdb")
    Conn.Open DSN


Min seneste test hvor systemet hang, brugtes 1m 32s på udelukkende ovenstående og ellers 19s i min header samt 13s til resten af koden. Det skal lige siges at når systemet ikke hænger bruges der ca. 3sek på at generere hele siden, som i dette tilfælde var et udtræk af 167 emner i databasen.

Virker det ikke lidt mystisk, at det er selve databaseforbindelsen der bruger tiden ?
Avatar billede 3z Nybegynder
19. november 2007 - 22:35 #3
...og igen en test hvor der brugtes 58s på at åbne databaseforbindelsen og 1s på hele resten af koden ???
Avatar billede keysersoze Guru
19. november 2007 - 22:53 #4
der kan være mange grunde til det - først og fremmest, så er access jo slet ikke beregnet til web og det er en singleuser database og dvs databasen let kan blive en flaskehals uden lige med mange brugere.

En lille ting der måske kunne hjælpe var at gå direkte ned i JET fremfor gennem Access - dette _mener_ jeg også er anbefalingen fra MS. Jeg går selvfølgelig ud fra at du sørger for at lukke al database-arbejde grundigt så snart du er færdig med det - så dernæst må du prøve at teste på antal brugere (fx en anden database kun du bruger på samme domain) og serverperformance (fx din nuværende database og kode på et andet domain og/eller server).
Avatar billede 3z Nybegynder
19. november 2007 - 22:57 #5
Jeg ved ikke lige hvad du mener med JET ? Har du et kode eksempel ?
Jeg har i min footer følgende: Conn.Close men må nok indrømme at jeg ikke har husket rs.close og set rs = nothing :)

Disse loadtider er med mig alene på systemet, så det er næppe antal brugere :)
Avatar billede keysersoze Guru
19. november 2007 - 23:40 #6
fx
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=XXX"

Det er ikke strengt nødvendigt at lukke dine recordsets - de bør som udgangspunkt blive lukket sammen med din connection. Det er dog god kodeskik at gøre det alligevel. Om det er en forglemmelse eller mangel ved jeg ikke men som med recordsets skal du også huske at sætte conn til nothing.

Jeg tror det bliver svært at komme meget nærmere - bedste bud er at du skal teste dig ud af det. Prøv fx en side med kun din conn open og close og se hvordan den kører - prøv det med den samme database og kode på din anden side på samme webserver.
Avatar billede totalpc Seniormester
20. november 2007 - 14:53 #7
3z > Jeg kan desværre ikke bidrage til løsningen af dit problem, men må jeg spørge hvordan du laver de timestamps for at se hvor flaskehalsen er?
Avatar billede The Real Yoda Juniormester
20. november 2007 - 15:43 #8
Man kunne forestille sig at du lider under det samme som mange andre gør med access.

Det er simpelthen ikke hurtigt nok, bruger alt for meget disk tid..

Et skift til MsSql eller MySql ville nok forbedre performance en hel del..
Avatar billede keysersoze Guru
20. november 2007 - 21:52 #9
1-1½ minut burde det dog langt fra tage trods alt :)
Avatar billede 3z Nybegynder
21. november 2007 - 16:39 #10
Jeg har bare placeret nogle variabler ned igennem koden for, at se hvilken del af koden den bruger tid på.
f.eks.
HeaderStart = now
...kode...
HeaderSlut = now
...kode...
NykodeStart = now
...kode
NykodeSlut = now

og så nederst udskrevet alle variabler. Dermed kan du se hvor den bruger længst tid.

Hos mig er det så ved åbning af databasen hvilket jeg fatter nada af... :(
Avatar billede keysersoze Guru
16. december 2007 - 11:04 #11
lukketid?
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