aleborgMedlem sedan jan. 20013 341 inlägg Jag håller på att diskutera med en kund som har missat en del stängningar av databasen(MySQL). Jag gav ett exempel på smidig kod som jag anser vara optimerad! Kunden tyckte min var krånglig eftersom att man måste komma ihåg indexet i arrayn istället för <%=RS("Adress")%>. Han frågade mig vilken jag tyckte var smidigast av följande:
Kundens kod:
Variant 1:
<%
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
%>
Variant 2:
<%
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
SQL-fråga
' 10-20 rader HTML-kod
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
%>
Min kod såg ut så här:
Funktionen samt connstr lägger du i en include
<%
'Hämta databas info
'-------------------------------------------------------------------------------
Function getDbRows( strCon, strSql )
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strCon
Set RS = Conn.Execute( strSql )
If RS.EOF Then
rader=null
Else
rader = RS.getrows
End If
RS.close
Set RS = Nothing
Conn.Close
Set Conn=Nothing
getDbRows = rader
End Function
‘Databas sträng(koppling)
'--------------------------------------
connstr = "Driver={Mysql};Server=localhost;Database=databasen;UID=Användarnamn;PWD=lösenord"
minArray = getDbRows(connstr, "Select Namn, Adress From Users")
If not IsNull(minArray) Then
For i = 0 To Ubound(minArray,2)
%>
Namn: <%=minArray(0,i)%>
Adress: <%=minArray(1,i)%>
<%
Next
Else %>
Tomt I databasen
<% End If %>
Och självklart ska man Dimma allt!
Vad anser ni?
erkaMedlem sedan dec. 19996 522 inlägg Personligen gillar jag getrows, fungerar snabbt.Dock krångligt att se vad det är man skriver ut ibland. Av kundens alternativ är ju alternativ 2 det mest kloka,dumt att öppna databasen och stänga den hela tiden, tar mer prestanda
Din använder ju GetRows vilket är en fördel om databasen är stor. Men om du bara hämtar ut två fält kanske Recordset är bättre? Testa dig fram och mät tiden för exekvering med eller utan GetRows.
mrblondeMedlem sedan aug. 20012 349 inlägg en grej man kan göra är att skapa constanter som heter som fälten i databasen och ge dem värdet av samma fält i arrayen, då ser man rätt tydligt vad man hämtar i sin array och det ger en väldigt liten prestanda förlust. För att öka tydligheten.
Har för mig att det har diskuterats tidigare och att det finns en artikel på https://www.4guysfromrolla.com om detta.
Jo, men om man returnerar recordsetet från ett com-objekt då? Ska man returnera ett dictionary med siffrorna då?
Blir inte det lika långsamt och ganska mycket krångligare då?
Dessutom så är det ju inte alltid GetRows är snabbare och inte ofta det ger någon större förbättring.
Se bara till att använda frånkopplade recordsets.
mrblondeMedlem sedan aug. 20012 349 inlägg
Erik Juhlin skrev:
Jo, men om man returnerar recordsetet från ett com-objekt då? Ska man returnera ett dictionary med siffrorna då?
Blir inte det lika långsamt och ganska mycket krångligare då?
Det var väl mest en allmän idé man kan använda sig av i vissa fall och inte en universallösning jag hade :)
jupitersMedlem sedan sep. 2002104 inlägg Here are some sample benchmarks for three runs using
each method (not done under a controlled environment
but close enough to prove the point!):
---------------rs("fieldname") rs(x) 'set method'
Results: (in seconds) 2.967 1.650 0.586
Results: (in seconds) 2.824 1.611 0.602
Results: (in seconds) 2.893 1.613 0.594
-----------Average: 2.895 1.625 0.594
http://www.4guysfromrolla.com/webtech/120899-1.shtml
PatrikBMedlem sedan mars 20002 836 inlägg sälv har jag en annan variant:
'## -- skapa en global connection för hela sidan --
'## -- sql-fråga --
'## -- hämta poster som array --
'## -- sql-fråga --
'## -- hämta poster som array --
'## -- sql-fråga --
'## -- hämta poster som array --
'## -- stäng connection när jag har hämtat allt som behövs --
'## -- börja loopa igenom arrayerna på rätt ställe --
'## -- FUNCTIONERNA I EN INCLUDE FIL --
funktionen för att hämta records som array:
Function GetDbRows(query, cnn)
Dim rst
Set rst = cnn.Execute(query)
If rst.EOF Then
GetDbRows = null
Else
GetDbRows = rst.GetRows()
End If
Set rst = Nothing
End Function
likadant har jag funktioner (metoder) för att skapa connection, recordset (både vanliga och adodb.recordsets)
Mest optimerat? ... klart enkelt att "administrera" med en vettig felhantering.
cya,
PatrikB
Om man kollar på 4GuysFromRolla så tycker man ju att rs(0).Value borde vara lika snabbt som det senaste då.
PatrikBMedlem sedan mars 20002 836 inlägg Blir till att testa lite granna efter 4Guys modellen.
Tur man har "real world" info att testa med
cya,
/PatrikB
PatrikBMedlem sedan mars 20002 836 inlägg En annan sak som speedar upp hämtningar är att begränsa max antal poster som returneras. Till det krävs det ofta att man har en bra sökfunktion för att kunna "hitta rätt(a) post(er)".
Vilken nytta har användaren att 1000-tals poster returneras egentligen?
cya,
/PatrikB