webForumDet fria alternativet

orsakar problem på servern..hm

ASPur ASP

13 svar · 245 visningar · startad av arvido

arvidoMedlem sedan nov. 200112 inlägg
#1

Hej

Hmm.. jag har gjort ett litet online spel. Detta spel besöks dock av ganska många användare vilket stälde till med problem när jag körde med en Access DB.
DKnet (som jag har min sida på) klagade mycket och tillsist stängde av min sajt för att det var några skript på vissa sidor som orsakade problem på deras server. En fredagskväll så råkade det vara 55 st online samtidigt vilket slöade sidan totalt och fick den tillsist att krasch!!

Jag trodde att problemet hade uppståt pga av att Access DBn inte klara så många online. Så efter ett tag bytte jag till mySQL. Detta skötte sig ganska bra... tills idag. Då de stängde ner min sajt igen :( och skickade ett mejl med en lista på vissa sidor som återigen hade orsakat problem på deras server.

När jag granskade sidorna visade det sig att alla dessa innehöll loopar som hämtar specifik data från mySQLen.

Nu vet jag inte vad jag skall göra, om looparna nu är problemet.. (vilket jag tycker vore mycket konstigt) hur skall jag fixa till dem??

Tänkte lägga upp lite av min kod som visar hur jag hämtar infon från mySQLen via dessa loopar:

<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={MYSQL};server=localhost;db=xxx;uid=xxx;pwd=xxx;"
Set RecSet = Server.CreateObject("ADODB.Recordset")

Visa = "SELECT ID, Nytt FROM Brev WHERE ID = " & session("uid") & " ORDER BY Ct DESC"
RecSet.Open Visa, Connect, 3, 3

	Dim antalB, brevtxt
	antalB = 0
	brevtxt = ""

	Do While Not RecSet.EOF
		
		If RecSet("Nytt") = "True" then antalB = antalB + 1

	RecSet.MoveNext
	Loop
	
		If antalB \> 0 then brevtxt = "\[" & antalB & "\]"
	
RecSet.Close

Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
%>

Vore väldigt tacksam om någon kunde ge ngn kommentar på detta. Det kanske även önskas mer kod för att kunna bilda sig en uppfattning om vad som kan vara problemet??

Mvh Arvid

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Du kan förenkla koden något.

<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={MYSQL};server=localhost;db=xxx;uid=xxx;pwd=xxx;"

Visa = "SELECT count(*) FROM Brev " &_
" WHERE ID = " & session("uid") & _
" and nytt = 'True' "
set rs = connect.execute(Visa)
Dim antalB, brevtxt
brevtxt = ""
antalB = recset(0)

If antalB > 0 then brevtxt = "[" & antalB & "]"

RecSet.Close
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
%>

Hur är tabellen brev definierad? Vad är primärnyckel? Har du några index?

------------------
essentitia preter non sans multiplicandum

ToonsterMedlem sedan feb. 20001 590 inlägg
#3

55 st online samtidigt är inte mycket alls, och borde inte vara några problem oavsett mySql eller Access. Troligtvis är det så att dina scriptfiler inte funkar helt.
Minimera tiden för databasanslutningar, och stäng dessa anslutningar så fort som möjligt.

Försök även att göra sidorna så att de inte baseras på databasinformation.

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

arvidoMedlem sedan nov. 200112 inlägg
#4

Tack för inläggen!

I mySQL:en har jag en tabell som heter just Brev. Primärnyckeln har jag döpt till Ct (fråga mig inte varför!).
Har inga index, mer än primärnyckeln som jag antar är indexerat automatiskt..

Läste precis ett inlägg om att man kunde fixa index på många fält, men tror att det hela är mycket mer allvarligt..

Fick idag ett nytt mail ifrån dem som ser riktigt farligt ut :(

De skriver:
"Er domän har ännu en gång hängt webbservern, ni orskara också jätte stora problem på mysql servern. Detta beror säkert på att ni inte har gjort om era script till mysql. Ni har orsakat väldigt många problem för oss och våra kunder, får ni något mer fel efter att ni har gått igenom era script så kan vi av förklarliga själv inte hosta er domän hos oss."

Hmm, jag trodde att man inte behövde göra om scripten särskilt mycket för att de skulle passa till mySQL. Troligtvis måste jag koda om hela sidan.

Angående Toonsters inlägg så måste jag nog tyvärr bygga sidorna på ganska så mycket databasinfo. Det är ett litet spel som liknar något åt Utopia och Hattrick hållet som det handlar om.

Hur bygger man en sida utan RecSet när man hämtar/spara/tarbort data från en mySQL??

iceM2Medlem sedan mars 2001243 inlägg
#5

Egentligen vore väl det bästa om du publicerade ännu mer kod här så kan säkert något hitta några allvarliga fel, för det måste ju finnas om du tynger ner en hel mySQL server! :i

RE: Stavar som en kratta när jag ska skriva snabbt..

------------------
"Ni tre går och bildar en kvadrat" (Rolf Zetterlund under ett träningspass)

[Redigerat av iceM2 den 11 dec 2001]

arvidoMedlem sedan nov. 200112 inlägg
#6

Okej, jag postar mer info.

På alla mina sidor där databasen används har jag lagt in en "include file" där jag öppnar Connectar till DBn och där jag även loopar igenom en tabell för att kolla om ex. lösenordet som jag har sparat i sessions stämmer överrens med de i DBn.

Här följer lite kod från include filen:

-------------------------------------
<%

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver=MySQL;server=x;uidx;pwd=x;database=x;"
Set RecSet = Server.CreateObject("ADODB.Recordset")

Visa = "SELECT Unamn, Pass FROM profil"
RecSet.Open Visa, Connect

X = FALSE
Y = FALSE

Do Until X = TRUE AND Y = TRUE OR RecSet.EOF

	If RecSet("Unamn") = Session("unamn") Then X = TRUE	
	If RecSet("Pass") = Session("passw") Then Y = TRUE		

RecSet.MoveNext
Loop

RecSet.Close

If X = FALSE Or Y = FALSE Then Response.Redirect "sorry.htm"

Visa = "SELECT \* FROM Killed"
RecSet.Open Visa, Connect

	live = True
	Do Until live = False Or RecSet.EOF
		If RecSet("ID") = session("idnr") then live = False
	RecSet.MoveNext
	Loop

	If live = False then Response.Redirect "sorry.htm"

RecSet.Close

%>
------------------------------------

Som sagt har jag denna kod på alla sidor där jag arbetar med databasen.

En sida som DKnet bland annat har klagat på är:

infoG.asp
-----------------------------------
<%
Response.Buffer = True
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "cache-control", "no-store"
%>

<!-- #include file="start.inc" -->

<html>

<head>
<title>Gladiator</title>
</head>

<body bgcolor="#E8E8E8" link="#000080" vlink="#000080" alink="#000080">

<p><font face="Verdana" size="1">

<%
' ********************************************************************
Function br(str)
Dim antal, tecken, count
antal = 35 'antal tecken som raden skall vara.
for tecken = 1 to len(str)
count = count + 1
Response.Write Mid(str, tecken, 1)
If count > antal Then Response.Write "<br>": count = 0
next
End Function
' ********************************************************************

On Error Resume Next
Visa = "SELECT * FROM Rollpers WHERE ID = " & Request.QueryString("glaid") & " "
RecSet.Open Visa, Connect, 3, 3

Dim TrueV
TrueV = True

If Err.Number then TrueV = False

If TrueV = True then

Dim ts()
ReDim ts(3)
Dim tts()
ReDim tts(3)

Dim purl
purl = RecSet("Bild")

x = 0
Do Until x = 3
	x = x + 1
	
	If x = 1 then ts(1) = RecSet("Fys")
	If x = 2 then ts(2) = RecSet("Smi")
	If x = 3 then ts(3) = RecSet("Sty")
			
	If ts(x) \< 1 then tts(x) = "nonexistent"
	If ts(x) \> 0 then tts(x) = "usel"
	If ts(x) \> 1 then tts(x) = "dålig"
	If ts(x) \> 3 then tts(x) = "hyfsad"
	If ts(x) \> 5 then tts(x) = "bra"
	If ts(x) \> 7 then tts(x) = "utmärkt"
	If ts(x) \> 11 then tts(x) = "unik"
	If ts(x) \> 15 then tts(x) = "fenomenal"
	If ts(x) \> 20 then tts(x) = "gudalik"
	
Loop

Dim kptext, namnet, datum

If RecSet("Kpa") = RecSet("Kpm") then kptext = "frisk"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.99) then kptext = "skråmor"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.8) then kptext = "stabil"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.7) then kptext = "mindre allvarligt"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.4) then kptext = "allvarligt"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.25) then kptext = "mycket allvarligt"
If RecSet("Kpa") \< round(RecSet("Kpm") \* 0.1) then kptext = "kritiskt"

infotxt = Replace(RecSet("Looks"), "<", " ")
infotxt = Replace(infotxt, ">", " :)")

infotxt = Replace(infotxt, vbcrlf, "<br>")
infotxt = Replace(infotxt, " b :)", "<b>")
infotxt = Replace(infotxt, " /b :)", "</b>")

namnet = RecSet("Rnamn")

Session.LCID = 1053
datum = FormatDateTime(RecSet("Log"), vbLongDate)
%>

\</font\>

<div align="left">
<table border="0" cellspacing="0" width="455" cellpadding="0">
<tr>
<td width="453" colspan="2"><b><font size="3"><font face="Verdana"><% =UCase(namnet) %></font></font></b></td>
</tr>
<tr>
<td width="182" valign="top">
<div align="center">
<center>
<table border="0" cellspacing="0" width="209" cellpadding="0">
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1" color="#666666"\>\<b\>ALLMÄNT\</b\>\</font\>
  \</td\>
\</font\>
        \</tr\>
        \<tr\>
          \<font face="Verdana" size="1"\>

  \<td width="207"\>
    \<font face="Verdana" size="1"\>

<b>
Ras: </b><% =RecSet("Ras") %>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>

<b>
Kön: </b><% =RecSet("Kon") %>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>

Ålder: </b><% =RecSet("Year") %>
</font></td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>Grad: \</b\>
    \<% =RecSet("Grad") %\>

</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>Klan: \</b\>
    \<a href="klan3.asp?klanid=\<% =RecSet("KlanID") %\>"\>
    \<% =RecSet("Klan") %\>
    \</a\>\</font\>
  \</td\>
\</font\>
        \</tr\>
        \<tr\>
          \<font face="Verdana" size="1"\>

  \<td width="207"\>&nbsp;
  \</td\>
\</font\>
        \</tr\>
        \<tr\>
          \<font face="Verdana" size="1"\>

  \<td width="207"\>\<font face="Verdana" size="1" color="#666666"\>\<b\>EGENSKAPER\</b\>\</font\>
  \</td\>
\</font\>
        \</tr\>
        \<tr\>
          \<font face="Verdana" size="1"\>

  \<td width="207"\>
    \<font face="Verdana" size="1"\>\<b\>

Fysik:
</b><% =tts(1) %>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>

Smidighet:
</b><% =tts(2) %>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>\<font face="Verdana" size="1"\>

<b>
Styrka:
</b><% =tts(3) %>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

  \<td width="207"\>
  &nbsp;
  \</td\>
\</font\>
        \</tr\>
        \<tr\>

  \<td width="207"\>
  \<b\>\<font color="#666666" face="Verdana" size="1"\>FÄRDIGHET\</font\>\</b\>
  \</td\>
        \</tr\>
        \<tr\>
          \<font face="Verdana" size="1"\>

  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>Färdighet:

</b><% =RecSet("Fklass") %>
</font>
</td>
</font>
</tr>
<tr>
<td width="207"><font size="1"> </font></td>
</tr>
<tr>
<td width="207"><font color="#666666" face="Verdana" size="1"><b>STATUS</b></font></td>
</tr>
<tr>
<td width="207"><font face="Verdana" size="1"><b>Fysiskform: </b><% =kptext %>
</font>
</td>
</tr>
<tr>
<td width="207"><font size="1"> </font></td>
</tr>
<tr>
<font face="Verdana" size="1">

                  \<td width="207"\>\<font face="Verdana" size="1" color="#666666"\>\<b\>UTRUSTNING\</b\>\</font\>\</td\>
\</font\>
        \</tr\>
        \<tr\>
  \<font face="Verdana" size="1"\>

                  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>

Vapenarm:
</b><a href="infoF.asp?sakid=<% =RecSet("Vid") %>"><% =RecSet("Vapen") %>
</a>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

                  \<td width="207"\>\<font face="Verdana" size="1"\>

<b>
Sköldarm:
</b><a href="infoF.asp?sakid=<% =RecSet("Sid") %>"><% =RecSet("Skold") %>
</a>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

                  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>

Rustning:
</b><a href="infoF.asp?sakid=<% =RecSet("Rid") %>"><% =RecSet("Rust") %>
</a>
</font>
</td>
</font>
</tr>
<tr>
<td width="207"><font size="1"> </font></td>
</tr>
<tr>
<font face="Verdana" size="1">

<td width="207"><font face="Verdana" size="1"><b>:: <a href="historia.asp?histid=<% =RecSet("ID") %>">HISTORIA</a></b>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

<td width="207"><font face="Verdana" size="1"><b>:: <a href="statistik.asp?stat=<% =RecSet("ID") %>"> STATISTIK</a><br>
 </b>
</font>
</td>
</font>
</tr>
<tr>
<font face="Verdana" size="1">

                  \<td width="207"\>\<font face="Verdana" size="1"\>\<b\>:: \<a href="utman.asp?glaid=\<% =RecSet("ID") %\>"\>UTMANA \<% =RecSet("Rnamn") %\>\</a\>\<br\>
                    :: \<a href="mailsend.asp?uid=\<% =RecSet("ID") %\>"\> SKICKA ETT BREV\</a\>
                    \<br\>
                    \<br\>
                    \</b\>Inloggad: \<b\>\<% =datum %\>\</b\> \</font\>\</td\>
\</font\>
        \</tr\>
      \</table\>
      \</center\>
    \</div\>
  \</td\>
  \<td width="269" valign="top"\>
    \<div align="center"\>
      \<center\>
      \<table border="0" cellspacing="0" width="100%" cellpadding="0"\>
        \<tr\>
          \<td width="100%"\>\<img border="0" src="images/atorer/g13.jpg"\>\</td\>
        \</tr\>
        \<tr\>
          \<td width="100%"\>&nbsp;\</td\>
        \</tr\>
        \<tr\>
          \<td width="100%"\>
  \<font face="Verdana" size="1"\>

  \<b\>BIOGRAFI\</b\>
\</font\>
          \</td\>
        \</tr\>
        \<tr\>
          \<td width="100%"\>\<font face="Verdana" size="1"\>\<% =br(infotxt) %\>
\</font\>
          \</td\>
        \</tr\>
      \</table\>
      \</center\>
    \</div\>
  \</td\>
\</tr\>

</table>
</div>
<font face="Verdana" size="1">

<% RecSet.Close

Else
Response.Write "Tyvärr så har inte den här profilen någon gladiator."
End if

Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
%>

</font>

</body>

</html>
-------------------------------------

Hmm.. hoppas det här kanske kan ge något resultat.

Mvh Arvid

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Den första delen kan du skriva om

<%

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver=MySQL;server=x;uidx;pwd=x;database=x;"

Visa = "SELECT 1 FROM profil where Unamn = '" & session("unamn") & _
" and pass = '" & Session("passw") & "'"

set recset = connect.execute(visa)
session("live") = not recset.eof
recset.close

if session("live) then
Visa = "SELECT * FROM Killed where id = " & session("idnr) 
set recset = connect.execute(visa)
session("live") = recset.eof
RecSet.Close
end if

connect.close
if not session("live") then 
Response.Redirect "sorry.htm"
end if
%>

Är unamn indexerat? Varför har du en speciell tabell för dom som är killade? Kan du inte ha det som en egenskap i profiltabellen istället?

Räcker det inte att du gör detta på en sida och om användaren är godkänd så sätter du en sessionvariabel till true och sedan så använder du den istället för att fråga databasen.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 12 dec 2001]

arvidoMedlem sedan nov. 200112 inlägg
#8

Tackar tackar..
skall skriva om koden så att den blir lite smidigare :)

Jag lärde mig asp via idg.se/webstudio, där hade de ett exempel på ett login system som jag sedan begynnelsen har använt. Men nu inser jag att den kanske inte var den bästa...
Tror jag får skriva om ganska mycket på min sida.

Du har helt rätt, bättre att ha en sessions som man sätter till true och sedan kontrollerar.

Tbl Killed är till för att spara alla tidigare döda/raderade personer i spelet. Profil är en tbl där användarens info sparas och inte personen som man styr i spelet.
Rollpers heter tbln som spara "spel figurens" info.
Mitt spel är uppbyggt så att spelfigurerna kan dö (då raderas de) men profilen (användaren) som man skapat är fortfarnade kvar. Därför kollar jag i tbl Killed om man har kvar sin spelfigur eller ej.

Säger koden om infoG.asp er ngt??

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Säger koden om infoG.asp er ngt??

Den borde inte vara speciellt tung ur databassynpunkt. Det viktigaste är att du har index på de kolumner som du söker ofta på.

------------------
essentitia preter non sans multiplicandum

arvidoMedlem sedan nov. 200112 inlägg
#10

ps. unamn är inte ngt index, men detta kan skall jag iofs fixa till.

Tror ni att min kodning var såpass klumbig att det kunde skapa problem på en server när antalet online började trappas upp??

Tror ni problemen kan lösas via att jag koda om spelet till LarsGs variant??

iceM2Medlem sedan mars 2001243 inlägg
#11

Jag lärde mig asp via idg.se/webstudio, där hade de ett exempel på ett login system som jag sedan begynnelsen har använt. Men nu inser jag att den kanske inte var den bästa...
Tror jag får skriva om ganska mycket på min sida.

Att det inloggningsystem gjort av IDG/webstudio är en skam vet väl de flesta här på WF? Har tagit del av scriptet och läst trådarna om det, en mer inkompetent lösning får man nog leta efter... Om jag inte minns fel så var scriptet så slarvig skrivet att det räckte att skriva ett korrekt användarnamn varav lösenordets värde inte spelade en unik roll, huvudsaken var att det kunde hittas i databasen oavsett vilket värde användarnamnet hade. Bra lösning? Naehh :e

Okej nu försöker jag inte framställa mig själv som ett äkta ASP-snille för dit är vägen lång... Min mening med detta inlägg var bara att upplysa dig om att vara skeptiskt mot Webstudios kurser, visst de är "förhållandevis" bra men bristerna och osmarta lösningar är allt för många...

Jag har dock ett tips som kanske kan vara guld värt. Vad jag kunde se när jag snabbt skummade igenom din kod är du har ditt RecordSet och din anslutning till Databasen öppen på tok för länge än nödvändigt.

Istället för att hela tiden tillkalla Recordset objekt utspritt på sidan så kan du ju lägga in dem i egna variabler där du sedan stänger anslutningen. Vad jag såg så loopade du ju inte igenom huvuddelen av dataposthämtningen? Mitt exempel skulle kunna vara så här:

'Skapa recset objektet och anslutning
Dim strNamn, strVarning, strMal
strNamn = objRS("namn")
strVarning = objRS(varning)
strMal = objRS("mal")
'stäng rs objekt och db-koppling

Sedan pluppar du bara ut information, vad jag kunde se så behöver du inte i denna kod nödvändigtvis använda metoden GetRows.

Good luck, hoppas jag hjälpte något:)

------------------
"Ni tre går och bildar en kvadrat" (Rolf Zetterlund under ett träningspass)

[Redigerat av iceM2 den 11 dec 2001]

[Redigerat av iceM2 den 11 dec 2001]

BenganMedlem sedan juni 2000690 inlägg
#12

arvido: Jasså det var du din jä.... ;) Märkte att MySQL servern var slö som sirap sista tiden, frågor som normalt tar under 0,1 sek kunde ta uppåt 30 sek och en massa fel som to many connections. Kollade man status på servern så var det en hiskelig massa aborted clients och grejs.

Klagade hos Digikom och de sa mycket riktigt att ett konto hade stängts och nu funkar det normalt igen. Så du bör nog kolla igenom koden noga...

Orkar inte läsa igenom allt utan ville bara strö lite salt i såren ;)
Om det nu var din kod som orsakade problemet så måste något vara rejält fel. Du har ju redan fått bra råd om att stänga connection så fort som möjligt, använda getrows osv. Men frågan är om det inte är något ännu värre fel med, som att du under en viss förutsättning får en evighetsloop eller nåt. Verkar ju skumt att det skall påverka så markant annars.

------------------
MvH
/Bengan
www.bengan.com | Brossans Räjser
Nyheter för datanördar
"Better to be hated for who you are than loved for who you're not."

[Redigerat av Bengan den 12 dec 2001]

arvidoMedlem sedan nov. 200112 inlägg
#13

hehe, tack boys för era inlägg.

Skall ta åt mig era råd och bygga om sidan ganska rejält nu till helgen.

Så får jag hoppas att det löser sig.
Kanske återkommer med någon mer fråga..

Mvh Arivd

arvidoMedlem sedan nov. 200112 inlägg
#14

hm..

Nu håller jag på förfullt med att bygga om sidan. Kör med GetRows nu, och det funkar finfint. Sidorna laddas mycket snabbare :)

Jag har iofs upptäckt någonting på min mySQLAdmin.
När jag kollar på "Server" inne på WinMySQLAdmin så finns det en lång lista med massa info om servern.
Där finns även någonting som heter "Connections" som har värdet 2 när jag öppnar mySQL. Men när jag sedan surfa inne på min sida stiger den och till fler och fler connections... skall det vara så?? Eller stängs inte min db-connection rikigt på sidan??
Det har hänt att den har vart uppe i över 30... när jag har surfat ett tag på min sida.

mvh Arvid

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