/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Hele webhotellet går kold?
Fra : Mette Theilgaard


Dato : 02-09-08 07:52

Jeg har for nyligt skiftet over til en host, som kører windows.
Jeg har derefter haft problemer med ét enkelt af mine websider,
som jeg dog skulle mene er kodet med præcis samme metoder som
alle mine andre websites.

Jeg er bestemt ikke inde i den advanced del af ASP, men jeg
skulle mene at jeg ikke har gjort noget galt, men når jeg går ind
på siden og tjekker engang imellem, så er hele websiden gået
kold. Databasen er åben, og ikke lukket igen, så hele webhotellet
virker ikke. Jeg har fået af vide af hosten, at jeg enten har en
loop, hvor databasen bliver åbnet, eller så har jeg bare ikke
fået lukket databasen igen. Jeg har nu haft dette problem i en
måned og jeg er så træt af, at hverken jeg eller mine
asp-kammerarter kan gennemskue fejlen.

Her er koden på den side, som jeg mener lukkede webhotellet ned
idag:

<%
jeg laver en forbindelse til min database
%>

Noget tekst her

<%
strSQL = "SELECT COUNT(brugerID) as antal from brugere"
set rs_deltagere = Conn.Execute(strSQL)
%>

På nuværende tidspunkt er der ialt <%= rs_deltagere("antal") %>
deltagere i konkurrencen.

<%
rs_deltagere.Close
Set rs_deltagere = Nothing

Conn.Close
Set Conn = Nothing
%>

Jeg ved ikke med sikkerhed at det er den side, men da jeg fik ind
på siden idag, virkede den fint indtil jeg åbnede ovenstående
side i en popup.

Jeg har derefter en samlet fil, hvor jeg opbevarer alle mine
udtræk, indsætninger, sletninger og opdateringer til databasen.
Jeg forbinder til databasen i toppen af siden og afslutter i
bunden af siden. Dette skulle jeg ikke mene, at der er noget galt
i.

Indeni en if-sætning (tjekker blot querystring) laver jeg denne
løkke.

splitCheckbox = request.form("coregID")
splitCheckbox2= Split(splitCheckbox,",")

For i = 0 to Ubound(splitCheckbox2)
strSQL = "SELECT * FROM nyhedsbrev WHERE coregID = "&
splitCheckbox2(i)
Set rs_coreg = Conn.Execute(strSQL)

strSQL = "SELECT * FROM brugere WHERE brugerID = "&
request.querystring("userID")
Set rs_bruger = Conn.Execute(strSQL)

lodder = rs_bruger("brugerLodder") + rs_coreg("coregLodder")

strSQL = "UPDATE brugere set brugerLodder="& lodder &" WHERE
brugerID = "& request.querystring("userID")
Conn.Execute(strSQL)

strSQL = "INSERT INTO log (logCoregID,logBrugerID, logDato)
values ("& splitCheckbox2(i) &","& request.querystring("userID")
&",'"& now &"')"
Conn.execute(strSQL)
Next

Er det blot en dummefejl? Har jeg set mig blind på eet eller
andet? Det skal siges at jeg op til flere gange har testet sitet,
hvor alt virkede som det skulle.

Hjæææælp!

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Martin (02-09-2008)
Kommentar
Fra : Martin


Dato : 02-09-08 09:45

Mette Theilgaard wrote in dk.edb.internet.webdesign.serverside.asp:
> For i = 0 to Ubound(splitCheckbox2)
> strSQL = "SELECT * FROM nyhedsbrev WHERE coregID = "&
> splitCheckbox2(i)
> Set rs_coreg = Conn.Execute(strSQL)
>
> strSQL = "SELECT * FROM brugere WHERE brugerID = "&
> request.querystring("userID")
> Set rs_bruger = Conn.Execute(strSQL)
>
> lodder = rs_bruger("brugerLodder") + rs_coreg("coregLodder")
>
> strSQL = "UPDATE brugere set brugerLodder="& lodder &" WHERE
> brugerID = "& request.querystring("userID")
> Conn.Execute(strSQL)
>
> strSQL = "INSERT INTO log (logCoregID,logBrugerID, logDato)
> values ("& splitCheckbox2(i) &","& request.querystring("userID")
> &",'"& now &"')"
> Conn.execute(strSQL)
> Next

du åbner 2 record sets (rs_coreg, rs_bruger) hver gang løkken kører,
men lukker ikke nogen af dem

Hvis du indsætter følgende vil det nok hjælpe lidt.
rs_coreg.close
set rs_coreg = nothing
rs_bruger.close
set rs_bruger = nothing

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jørn Andersen (02-09-2008)
Kommentar
Fra : Jørn Andersen


Dato : 02-09-08 18:20

On 02 Sep 2008 06:52:09 GMT, Mette Theilgaard <admin@belliz.org> wrote:


>Jeg har for nyligt skiftet over til en host, som kører windows.
>Jeg har derefter haft problemer med ét enkelt af mine websider,
>som jeg dog skulle mene er kodet med præcis samme metoder som
>alle mine andre websites.

Martins svar er nok det, der konkret forårsager problemet.
Men du får lige et par kommentarer til noget mere af din kode, da der er
flere ting, der kan forbedres.


<snip>

><%
>jeg laver en forbindelse til min database
>%>
>
>Noget tekst her
>
><%
>strSQL = "SELECT COUNT(brugerID) as antal from brugere"
>set rs_deltagere = Conn.Execute(strSQL)
>%>
>
>På nuværende tidspunkt er der ialt <%= rs_deltagere("antal") %>
>deltagere i konkurrencen.
>
><%
>rs_deltagere.Close
>Set rs_deltagere = Nothing

Nu er ovenstående en meget lille bid, men principielt ville jeg:
strSql = ...
Set rs ...
intAntalBrugere = rs_deltagere("antal")
Sluk og luk rs og Conn

- og herefter udskrive.

Som sagt er skaden minimal her, men det principielle er:
- at adskille databehandling og præsentation
- holde connections og recordsets åbne så kort tid som realitisk muligt.

<snip>
>Jeg forbinder til databasen i toppen af siden og afslutter i
>bunden af siden. Dette skulle jeg ikke mene, at der er noget galt
>i.

Hmmm. Det er ikke optimalt. Omvendt er det heller ikke optimalt at åbne
og lukke forbindelsen for mange gange.
En logisk rækkefølge ville være:
- inputbehandling (fx fra Request.Form og .QueryString) - herunder
validering af input.
- databehandling
- udskrift


>Indeni en if-sætning (tjekker blot querystring) laver jeg denne
>løkke.

Inden denne If ville jeg hente input:
intUserId = request.querystring("userID")
+ validere (fx at det faktisk er et tal)

>splitCheckbox = request.form("coregID")
>splitCheckbox2= Split(splitCheckbox,",")

Her ville du gøre din kode mere læselig ved at navngive dine variable
efter hvilken type de forventes at være:
splitCheckbox -> strSplitCheckbox
splitCheckbox2 -> arrSplitCheckbox

>For i = 0 to Ubound(splitCheckbox2)
>strSQL = "SELECT * FROM nyhedsbrev WHERE coregID = "&
>splitCheckbox2(i)
>Set rs_coreg = Conn.Execute(strSQL)
>
>strSQL = "SELECT * FROM brugere WHERE brugerID = "&
>request.querystring("userID")
>Set rs_bruger = Conn.Execute(strSQL)
>
>lodder = rs_bruger("brugerLodder") + rs_coreg("coregLodder")

Som Martin skriver, skal de lukkes. Men eftersom du kun henter én værdi,
så er SELECT * helelr ikke en god idé:
strSQL = "SELECT coregLodder FROM ...
Set rs_coreg = Conn.Execute(strSQL)
intCoregLodder = rs_coreg("coregLodder")
rs_coreg.Close
Set rs_coreg = Nothing

strSQL = "SELECT brugerLodder FROM ...
Set rs_bruger = Conn.Execute(strSQL)
intBrugerLodder = rs_coreg("brugerLodder")
rs_bruger.Close
Set rs_bruger = Nothing
intLodder = intBrugerLodder + intCoregLodder

På denne måde har du recrdsets åbne kortere tid - og du har ikke to åbne
samtidigt.

Et eller andet siger mig dog, at du burde kunne trække intLodder direkte
ud af databasen med den rigtige SQL-streng. Men det kræver lidt mere
kendskab til databasens opbygning at sige det præcist.

En god tommelfingerregel er "lade databasen gøre arbejdet" så langt som
muligt.

>strSQL = "UPDATE brugere set brugerLodder="& lodder &" WHERE
>brugerID = "& request.querystring("userID")
>Conn.Execute(strSQL)
>
>strSQL = "INSERT INTO log (logCoregID,logBrugerID, logDato)
>values ("& splitCheckbox2(i) &","& request.querystring("userID")
>&",'"& now &"')"
>Conn.execute(strSQL)

Ovenstående er sådan set OK. Dog vil du formentlig kunne bruge
databasens tid (Now) i stedet for ASP'ens.
I en Access ville den sidste del af SQL'en hedde:
" ..., Now())"

Håber det kan hjælpe dig til lidt mere struktur og læsbarhed i din kode.


Good luck!

--
Jørn Andersen,
Brønshøj

Finn Elmgaard (02-09-2008)
Kommentar
Fra : Finn Elmgaard


Dato : 02-09-08 19:02


"Jørn Andersen" <jorn@jorna.dk> wrote in message
news:ikrqb4hs94gfhik8c1vtpkdva33qckdb20@4ax.com...
> On 02 Sep 2008 06:52:09 GMT, Mette Theilgaard <admin@belliz.org> wrote:
>
>
> >Jeg har for nyligt skiftet over til en host, som kører windows.
> >Jeg har derefter haft problemer med ét enkelt af mine websider,
> >som jeg dog skulle mene er kodet med præcis samme metoder som
> >alle mine andre websites.
>
> Martins svar er nok det, der konkret forårsager problemet.
> Men du får lige et par kommentarer til noget mere af din kode, da der er
> flere ting, der kan forbedres.
>
>
Jeg blev lidt overrasket over dette svar - ikke sådan at jeg ikke tror på
det - men jeg har faktisk selv gjort det samme mange gange. Jeg troede i min
naivitet, at det oprettede recordset i et loop blev "genbrugt" eller
"overskrevet" (ligesom en variabel). Derfor har jeg altid først lukket og
fjernet objectet efter at være kommet ud af loop'et. Vil det så sige, at når
jeg har haft nogle meget store loops, så har jeg efterladt tusindvis af
brugte objecter, der fylder i memory (memory leak)??

mvh
Finn



Jørn Andersen (03-09-2008)
Kommentar
Fra : Jørn Andersen


Dato : 03-09-08 16:52

On Tue, 2 Sep 2008 20:01:58 +0200, "Finn Elmgaard"
<finnxxx@elmgaard.com> wrote:

>Jeg blev lidt overrasket over dette svar - ikke sådan at jeg ikke tror på
>det - men jeg har faktisk selv gjort det samme mange gange. Jeg troede i min
>naivitet, at det oprettede recordset i et loop blev "genbrugt" eller
>"overskrevet" (ligesom en variabel).

Du har gjort mig i tvivl, og jeg kan ikke finde svar i "de kloge bøger".
Måske en anden ved det?

Men det er stadig et problem at have et recordset åbent længere end
nødvendigt. I Mettes tilfælde er der to recordsets (unødvendigt) åbne
samtidig med at der køres Conn.Execute.

>Derfor har jeg altid først lukket og
>fjernet objectet efter at være kommet ud af loop'et.

Og det ser det ikke umiddelbart ud til, at Mette havde gjort.

>Vil det så sige, at når
>jeg har haft nogle meget store loops, så har jeg efterladt tusindvis af
>brugte objecter, der fylder i memory (memory leak)??

Hvis siden bliver fuldt afviklet, bør serveren i nyere ASP-versioner
"rydde op" efter sig. Som jeg har forstået det, er det kun mens siden
afvikles, at der er belastning.


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste