webForumDet fria alternativet

Optimeringsfrågor

16 svar · 498 visningar · startad av nill

nillMedlem sedan okt. 2001387 inlägg
#1

Vet att det finns väldigt mycket information om detta på webforum och har också läst mycket av den. Har fått en viss uppfattning om vad som är rätt och vad som är fel men vill dubbelkolla.
Här kommer lite påståenden och frågor.

1. Man ska ha Response.Buffer = True efter Option Explicit på sidan.

2. Efter öppning av databas och Set Rs = Conn.Execute(SQL) ska man stänga både Conn och Rs med både .Close och Set ...= Nothing

3. Hur kan man gör man bäst en "subrutin" som öppnar databas, en som hämtar information från databas i en array och en som stänger databas för att göra sidan mer "skalbar"?

4. Är Include-filer prestandakrävande, t.ex. include i include?

5. Ska man stänga Conn direkt efter man hämtat något ur databasen eller bara Rs, och sedan stänga Conn när man inte ska använda databasen mer på sidan?

Väldigt tacksam om jag kunde få några definitiva svar på de här frågorna.

crisse6Medlem sedan dec. 20002 526 inlägg
#2

1. Ja
2. Ja
3. Vet ej ;)
4. Ju mer du inkluderar ju mer tar du av prestanda
5. Du ska val inte stanga rs eller db innan du ar klar med alla av dom ;)

VideMedlem sedan dec. 19998 577 inlägg
#3

3. Ett exempel å¨skalbarhet:
Gör en funktion som återger ett connectionobject, som argument ger du connectionsträngen.

Sedan gör du en funktion som återger ett recordset, du skickar med connecionobjektet och en SQL-sats som argument. I funktionen gör recordsettet till en array genom att sätta metoden getRows() på recordsettet.

4. Nej, det är inte märkbart mer prestandakrävande att inkludera med include än att lägga all kod i samma dokument (vilket är samma resultat). Men du får en bättre översikt och kan återanvänvända funktioner på ett smart sätt.

5. Du skall stänga dina objekt så fort du inte skal använda dom mer.

nillMedlem sedan okt. 2001387 inlägg
#4

På ditt svar 5. Men om man ska använda dem mer, men längre ner på sidan?

Engine^Medlem sedan dec. 20003 887 inlägg
#5

Svaret är väl givet? Stäng dina objekt när du ej ska använda dom mer (ska du då använda samma objekt längre ner på sidan ska du alltså inte stänga det... det innebär ju att du skulle behöva öppna det igen.).

OveRRidEMedlem sedan feb. 200112 078 inlägg
#6

Ett kodexempel? ;)

Har för mig att det var Erik Juhlin som knåpade ihop funktionen execute_sql.

Public Function getConn()
    Dim strPath 'As String
    strPath = server.mappath("/data/data.mdb")
    
    Set objConn = Server.CreateObject("ADODB.Connection")
    objConn.open "Provider=Microsoft.Jet.ADODB.4.0;Data Source=" & strPath    
    objConn.CursorLocation = 3
    objConn.CommandTimeout = 180
        Set getConn = objConn
    Set objConn = Nothing
End Function

Public Function execute_sql(strSql)
    Set objConn = getConn()
    If InStr(1, strSql, "UPDATE", 1) Or InStr(1, strSql, "DELETE", 1) Or InStr(1, strSql, "INSERT", 1) Then
        objConn.execute (strSql), , 128
    Else
        Set execute_sql = objConn.execute(strSql)
    End If
    Set objConn = Nothing
End Function
nillMedlem sedan okt. 2001387 inlägg
#7

Engine skrev:

Svaret är väl givet? Stäng dina objekt när du ej ska använda dom mer (ska du då använda samma objekt längre ner på sidan ska du alltså inte stänga det... det innebär ju att du skulle behöva öppna det igen.).

Jag tycker inte alls det är givet. Har läst många trådar här på webforum där det sägs att man ska stänga objecten (Connect och RecSet) så fort som möjligt.
Själv tycker jag i och för sig det skulle vara mer logiskt att öppna Connection i början av sidan och stänga den i slutet.

crisse6Medlem sedan dec. 20002 526 inlägg
#8

Vad ar mest jobbigast om tar ett exemepl, oppna en dorr 20 ganger, eller bara oppna den 1 gang? tycker det ar ratt klart jag.

nikoMedlem sedan juni 20022 599 inlägg
#9

Sen är det ju också ett misstag att tro att databasanslutningar verkligen öppnas och stängs varje gång man anropar open och close. I bakgrunden finns nämnligen något som heter connection pooling som kan vara bra att känna till:

http://www.sql-server-performance.com/bl_asp_ado.asp

http://support.microsoft.com/default.aspx?scid=KB;en-us;q191572

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmdac/html/pooling2.asp

OveRRidEMedlem sedan feb. 200112 078 inlägg
#10

Ursäkta mig, men artikeln förklarar med andra ord att man inte skall sätta connection-objektet till Nothing?

Jag skumläste den bara nu.

Engine^Medlem sedan dec. 20003 887 inlägg
#11

niko skrev:

Sen är det ju också ett misstag att tro att databasanslutningar verkligen öppnas och stängs varje gång man anropar open och close. I bakgrunden finns nämnligen något som heter connection pooling som kan vara bra att känna till:

http://www.sql-server-performance.com/bl_asp_ado.asp

http://support.microsoft.com/default.aspx?scid=KB;en-us;q191572

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmdac/html/pooling2.asp

Intressant! Man tackar för upplysningen. :)
Den andra länken var väldigt tydlig.

nikoMedlem sedan juni 20022 599 inlägg
#12

Ursäkta mig, men artikeln förklarar med andra ord att man inte skall sätta connection-objektet till Nothing?

Nej, men de förklarar kanske varför man sätter connections till nothing och att open/close/nothing fungerar delvis olika beroende på vilka drivers/DBMS:er man använder.

Att öppna en connection mot en SQL-server är ju tex en väldigt tung procedur med autentifikation och grejer. Varför skulle man då vilja stänga den så fort som möjligt? Hur kommer det sig att man överhuvudtaget kan öppna och stänga en connection X ggr på en sida utan att det knappt märks?

Jo, oftast öppnar och stänger man aldrig anslutningarna. Man bara bollar öppna connections fram och tillbaka mot en gemensam pool.

Det kan mao vara bra att känna till connection-pooling annars kan det vara svårt att förstå varför man skulle vara så pigg på att skapa och förstöra dyrbara objekt hela tiden.

nillMedlem sedan okt. 2001387 inlägg
#13

Vide skrev:

Du skall stänga dina objekt så fort du inte skal använda dom mer.

crisse6 skrev:

Vad ar mest jobbigast om tar ett exemepl, oppna en dorr 20 ganger, eller bara oppna den 1 gang? tycker det ar ratt klart jag.

det här blir jag ju förvirrad av. Jag har problem med att databasen får för många connections när många användare är inloggade. Och det måste ju gå att optimera koden så att detta går bättre.
För just nu hämtar jag på varje sida lite information om användaren i en inkludefil med

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open ConnStr

Set RecSet = Connect.Execute(SQL-kod)

RecSet.Close
Set RecSet = Nothing
Conect.Close
Set Connect = Nothing

Sen kommer en massa htmlkod och till sist andra databashämtningar och ändringar med samma syntax som ovan.
Detta fungerar tydligen inte så bra. Ska jag göra så att jag öppnar Connect i början av inklude-filen och stänger inte Connect förrän i slutet på sidan?
Skulle det hjälpa tro.

VideMedlem sedan dec. 19998 577 inlägg
#14

Varför inte göra alla databas anrop först på sidan och lägga resultatet i en eller flera variabeler som du skriver ut längre ned. Då kan du stänga din connection snabbt eftersom du inte använder den fler gånger.

nillMedlem sedan okt. 2001387 inlägg
#15

Det databasanrop som görs först ligger in en inklude-fil på alla sidor. Att göra som du säger i inklude-filen går inte ju.

nikoMedlem sedan juni 20022 599 inlägg
#16

En annan fråga: Är det din egen dedikerade server?

Om det är ett webhotell så är det ju inte givet att du kan "optimera bort" det faktum att det finns femtioelva andra sajter och besökare. Och att servern ibland har problem med få resurserna att räcka till alla.

nillMedlem sedan okt. 2001387 inlägg
#17

det är ju faktiskt ett webhotell. Men jag vill inte flytta än :)

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)