Avatar billede Slettet bruger
27. april 2009 - 17:51 Der er 6 kommentarer

Script overbelaster db

Jeg har følgende kode i et "spil" jeg er ved at lave, men hver gang denne kode bliver brugt så går IIS ned, eller helt nøjagtigt, denne åbner begge databaser og kan ikke finde ud af at lukke dem igen, og så fryser siden.
Er der en der lige kan se hvor problemet kunne ligge? Jeg ved ikke helt hvilke oplysninger i ellers har brug for, men i skal være velkommen til at spørge.

Håber i kan hjælpe og på forhånd tak.



  manualfodder = Onlynumbers(Request.Querystring("givepigfodder"))

  If manualfodder > 0 Then
    strSQL = "SELECT * From game_pigstable where gpigID=" & manualfodder & " AND gpigFarmID=" & Session("activefarm") & " AND IsNull(gpigSellDate) AND gpigPigWeightEnd < " & SITE_LOCAL_PIGSELLWEIGHT & " AND gpigDailyFodderMissing>0 AND gpigReadyForSale=false"
  Else
    strSQL = "SELECT * From game_pigstable where gpigFarmID=" & Session("activefarm") & " AND gpigLastFeed < Now()-1 AND IsNull(gpigSellDate) AND gpigPigWeightEnd < " & SITE_LOCAL_PIGSELLWEIGHT & " AND gpigReadyForSale=false Order By gpigLastFeed"
  End If
  Set rsPigs = ConnPigstable.Execute (strSQL)
  If not (rsPigs.EOF OR rsPigs.BOF) Then
  Do

  lastfeedday = rsPigs("gpigLastFeed")
  continuescript = true
  Do While Dateadd("d",1,lastfeedday) < Now() AND continuescript = true
    lastfeedday = Dateadd("d",1,lastfeedday)

    Randomize
    fodderusepig = (SITE_LOCAL_PIGFODDERUSEDAYMAX-SITE_LOCAL_PIGFODDERUSEDAYMIN+1)*rnd+SITE_LOCAL_PIGFODDERUSEDAYMIN
    fodderneeded = rsPigs("gpigGroupSizeEnd")*fodderusepig
    manuremade = (SITE_LOCAL_PIGMANUREMAX-SITE_LOCAL_PIGMANUREMIN+1)*rnd+SITE_LOCAL_PIGMANUREMIN
    totalmanuremade = rsPigs("gpigGroupSizeEnd")*manuremade
    piggrowth = (SITE_LOCAL_PIGGROWTHDAYMAX-SITE_LOCAL_PIGGROWTHDAYMIN+1)*rnd+SITE_LOCAL_PIGGROWTHDAYMIN

    If Clng(rsPigs("gpigPigWeightEnd")+piggrowth) >= Clng(SITE_LOCAL_PIGSELLWEIGHT) Then
      strSQL = "SELECT * From log_prices where upDate=" & Formatdatetime(lastfeedday,vbshortdate) & ""
      Set rsPrice = ConnMain.Execute (strSQL)
      If not (rsPrice.EOF OR rsPrice.BOF) Then
        readyforsale = "true"
        pigprice = rsPrice("upPigSellPrice")
      Else
        readyforsale = "false"
        pigprice = 0
      End If
      rsPrice.Close
      set rsPrice = Nothing
    Else
      readyforsale = "false"
      pigprice = 0
    End If

    If Clng(SITE_FARM_TOTALPIGFODDERAMOUNT) >= Clng(fodderneeded) Then

      continuescript = true
      SITE_FARM_TOTALPIGFODDERAMOUNT = Clng(SITE_FARM_TOTALPIGFODDERAMOUNT-fodderneeded)
      SITE_FARM_MANURE = Clng(SITE_FARM_MANURE+totalmanuremade)

      strSQL2 = "Update game_pigstable set "
      strSQL2 = strSQL2 & "[gpigPigWeightEnd]=[gpigPigWeightEnd]+" & Replace(piggrowth, ",", ".") & ", "
      strSQL2 = strSQL2 & "[gpigSellPrice]=" & Replace(pigprice, ",", ".") & ", "
      strSQL2 = strSQL2 & "[gpigFodderUseTotal]=[gpigFodderUseTotal]+" & Replace(fodderneeded, ",", ".") & ", "
      strSQL2 = strSQL2 & "[gpigDailyFodderMissing]=0, "
      strSQL2 = strSQL2 & "[gpigLastFeed]='" & ConvertDate(lastfeedday) & "', "
      strSQL2 = strSQL2 & "[gpigReadyForSale]=" & readyforsale & " "
      strSQL2 = strSQL2 & "where gpigFarmID=" & Session("activefarm") & " AND gpigID=" & rsPigs("gpigID") & " "
      ConnPigstable.Execute(strSQL2)

      strSQL2 = "Update game_gamefarms set "
      strSQL2 = strSQL2 & "[faManure]=[faManure]+" & Replace(totalmanuremade, ",", ".") & " "
      strSQL2 = strSQL2 & "where faID=" & Session("activefarm") & " "
      ConnMain.Execute(strSQL2)

      strSQL = "SELECT game_buildings.*, game_buildings_users.* FROM game_buildings_users INNER JOIN game_buildings ON game_buildings_users.usbldBuildingID = game_buildings.bldID WHERE usbldFarmID=" & Session("activefarm") & " AND usbldStoredProduct='pigfodder' Order by usbldStored"
      Set rsFodder = ConnMain.Execute(strSQL)
      If Not (rsFodder.EOF OR rsFodder.BOF) Then
      Do While Not Clng(fodderneeded) = 0
      If Clng(rsFodder("usbldStored")) >= Clng(fodderneeded) Then
        strSQL2 = "Update game_buildings_users set "
        strSQL2 = strSQL2 & "[usbldStored]=[usbldStored]-" & Replace(fodderneeded, ",", ".") & " "
        strSQL2 = strSQL2 & "where usbldID=" & rsFodder("usbldID") & " "
        ConnMain.Execute(strSQL2)
        fodderneeded = 0
      Else
        strSQL2 = "Update game_buildings_users set "
        strSQL2 = strSQL2 & "[usbldStored]=0 "
        strSQL2 = strSQL2 & "where usbldID=" & rsFodder("usbldID") & " "
        ConnMain.Execute(strSQL2)
        fodderneeded = fodderneeded-rsFodder("usbldStored")
      End If
      Loop
      End If
      rsFodder.Close
      set rsFodder = Nothing

    Else

      continuescript = false

      strSQL2 = "Update game_pigstable set "
      strSQL2 = strSQL2 & "[gpigDailyFodderMissing]=" & Replace(fodderneeded, ",", ".") & " "
      strSQL2 = strSQL2 & "where gpigFarmID=" & Session("activefarm") & " AND gpigID=" & rsPigs("gpigID") & " "
      ConnPigstable.Execute(strSQL2)

    End If

  Loop

  rsPigs.MoveNext
  Loop While Not rsPigs.EOF
  End If
  rsPigs.Close
  set rsPigs = Nothing
Avatar billede webweaver Praktikant
27. april 2009 - 18:10 #1
Jeg programmerer godt nok ikke ASP men PHP, men for mig lyder det som om at der et sted i koden bliver stillet en betingelse, som så åbentbart opfyldes igen og igen.. En form for lykke, som hiver data ud af databasen fx. Når den først sættes igang, så stopper den ikke igen, hvilket gør computeren meget langsom og hvor man bliver nødt til at lukke programmet. Det kræver en del resourcer og skulle arbejde uendeligt :)

Kunne det evt. være dit problem?
Avatar billede Slettet bruger
27. april 2009 - 18:22 #2
Ja, det er også min teori, men kan bare se hvor den fejl skulle ske, syntes jeg har været begge loop's igennem flere gange uden at finde noget unormalt...
Avatar billede softspot Forsker
28. april 2009 - 08:40 #3
Prøv at ændre disse to linier:

  If not (rsPigs.EOF OR rsPigs.BOF) Then
  Do


til denne ene linie:

  Do While not (rsPigs.EOF OR rsPigs.BOF)
Avatar billede softspot Forsker
28. april 2009 - 08:53 #4
Så skal du også ændre disse to linier:

  Loop While Not rsPigs.EOF
  End If


til denne:

  Loop


Jeg er godt klar over (nu), at dette ikke nødvendigvis løser dit problem, men der er ikke nogen grund til at lave check med if-then inden et do-loop, når man kan lave checket i selve do-loopets betingelsesdel.


Rent bort set fra det, så prøv, for debuggingens skyld, at lave en nødbremse på løkkerne, så du er sikker på at løkkerne bliver stopeet på et tidspunkt. Dette kan du f.eks. gøre ved at lægge en loopcounter ind i hver løkke, som sikrer, at løkken miksimalt køres et bestemt antal gange (alt efter hvad der er realistisk for det givne scenarium).

Tænk i øvrigt på, at databaseopslag er dyre at lave, så hvis dine løkker gentages mange gange, vil serveren skulle arbejde meget med at kommunikere med databasen. Hvis det så tillige med, er en Access-database, så vil den nok blive spærret godt og grundigt for alle andre i den periode du opdaterer den...
Avatar billede softspot Forsker
28. april 2009 - 09:07 #5
Hvad índeholder kolonnen usbldStored?

Jeg tænker på om ud har overvejet, hvad der f.eks. sker, hvis fodderneeded bliver MINDRE end nul i denne løkke:

  strSQL = "SELECT game_buildings.*, game_buildings_users.* " & _
    "FROM game_buildings_users " & _
    "INNER JOIN game_buildings " & _
    "ON game_buildings_users.usbldBuildingID = game_buildings.bldID " & _
    "WHERE usbldFarmID=" & Session("activefarm") & " " & _
    "AND usbldStoredProduct='pigfodder' " & _
    "Order by usbldStored"
  Set rsFodder = ConnMain.Execute(strSQL)
  If Not (rsFodder.EOF OR rsFodder.BOF) Then
    Do While Not Clng(fodderneeded) = 0
      If Clng(rsFodder("usbldStored")) >= Clng(fodderneeded) Then
        strSQL2 = "Update game_buildings_users set "
        strSQL2 = strSQL2 & "[usbldStored]=[usbldStored]-" & Replace(fodderneeded, ",", ".") & " "
        strSQL2 = strSQL2 & "where usbldID=" & rsFodder("usbldID") & " "
        ConnMain.Execute(strSQL2)
        fodderneeded = 0
      Else
        strSQL2 = "Update game_buildings_users set "
        strSQL2 = strSQL2 & "[usbldStored]=0 "
        strSQL2 = strSQL2 & "where usbldID=" & rsFodder("usbldID") & " "
        ConnMain.Execute(strSQL2)
        fodderneeded = fodderneeded-rsFodder("usbldStored")
      End If
    Loop
  End If


For en sikkerheds skyld, bør du nok bruge en mere bredt favnende betingelse for at stoppe din løkke som f.eks.:

    Do While Clng(fodderneeded) > 0

...og skal der i øvrigt ikke flyttes til næste række, eller er det med fuldt overlæg, at der ikke udføres rsFodder.MoveNext?
Avatar billede Slettet bruger
28. april 2009 - 17:40 #6
Jeg har ikke haft tid til at afprøves jeres svar endnu, men kan da lige forklare hvad det er der skal ske i dette script.

Først finder den ud af hvor mange aktive hold grise der i stalden (rsPigs) og for hvert hold den finder, vil den så blive ved med at køre et loop indtil "lastfeedday" er større end Now() og for hver dag den forøger med kommer så den store opdatering af databasen. SQL'en "rsFodder" finder ud af hvor meget foder der er i hver silo og bruger det der er, dvs at "fodderneeded" aldrig skulle kunne blive mindre end 0, når "fodderneeded" så er lig med 0 så springer den videre til næste silo osv.

Håber jeg fik forklaret det godt nok.

Hvad det angår databasen, så er access den eneste db type jeg har forstand på at bruge, derfor har jeg valgt den, men hvis i har et andet forslag så vil jeg da gerne høre om det.
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