Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 01:31 Der er 16 kommentarer og
1 løsning

Opdater MySQL regelmæssigt - ASP

Hej Eksperter.

Jeg sidder og er stødt ind i et bump på vejen.

Jeg skal til, at lave et råstof system til et browserspil hvor en by fx udvinder 2400 træ pr. time.

Jeg vil ikke have det sådan, at byen får 2400 træ stukket ind på kontoen hver time - men derimod, at det bliver opdateret hen af vejen så der bl.a. også kan købes for de råstoffer der kommer løbende ind på kontoen..

Men.. Hvis vi nu siger, at der kommer 2400 træ pr. time. Så er det jo 2400/60 pr. minut = 40
og det er jo 40/60 pr. sekund = 0,66

Derfor skal denne bruger jo faktisk have 0,66 stykker træ hvert sekund hele døgnet rundt - også selvom han ikke er online..

Nogen der ved hvordan dette løses??
Avatar billede arne_v Ekspert
21. juni 2010 - 01:41 #1
Hvis træ måles i heltal så er du nødt til kun at opdatere for et tidsinterval der giver et heltal.

Selve opdateringen kan enten køres af et ikke-web-app task eller du kan lade web requests trigger en update.
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 02:03 #2
Det første forstår jeg udmærket godt begrundelsen bag og det hele :)

- Dog.. Hvad mener du med et "ikke-web-app task" og web requests?
Jeg er næsten sikker på jeg ved hvad du mener - men kender ikke begreberne som du omtaler dem.
Avatar billede arne_v Ekspert
21. juni 2010 - 02:23 #3
"ikke-web-app task" et eller andet program der kører og som ikke er en web app. Kan være et program som køres af cron / Windows Scheduler eller et permanent kørende process (daemon / Windows Service).

"web requests" de almindelige requests som kommer til web app.
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 02:39 #4
Okay så forstår jeg desværre ikke helt alligevel..

Hvis vi nu siger, at det er en "web request" - mener du så fx:
strSQL = "UPDATE byinfo SET trae bla bla.."??

For hvordan har du tænkt dig, at få den til at gentage sig - også hvis brugeren er offline.?

Jeg forstår ikke helt.. beklager
Avatar billede arne_v Ekspert
21. juni 2010 - 03:09 #5
web request = en eller anden requester en ASP side fra dit site

og ideen er at du ikke nødvendigvis laver den opdatering hver time, men at du sørger for at alle de opdateringer der skal udføres er udført inden data skal vises
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 03:21 #6
Vil det ikke slide meget hårdt webserveren hvis vi nu siger, at 500 spiller spillet dagligt og der er 2000 byer i hele verden hvori alle råstoffer opdatere konstant inde i databasen?
Avatar billede arne_v Ekspert
21. juni 2010 - 03:51 #7
Ikke nødvendigvis. Hvis du f.eks. opdaterer hver time, så skal der udføres 24 opdateringer på et døgn. Uafhængigt af hvor mange der spiller.

Hvis du lader en request trigge opdatering, så skal der:
- laves 0-24 opdateringer per døgn uanset antal spillere
- laves en check af om der er behov for en opdatering for hver request (men den kan caches i Application objekttet så du ikke bhøver ramme databasen hver gang)
Avatar billede The Real Yoda Juniormester
21. juni 2010 - 08:46 #8
Du kunne jo også lave det sådan at du laver en funktion i dit spil, der viser hvor meget træ man har, og det så er den du kalder hver gang du viser mængden af træ

Når så du henter antalTræ fra databasen kan du samtidig hente TræOpdateret feltet, og se hvornår brugeren sidst er tilskrevet sit træ..

hvis det er 18 dage siden, så er 18 dages sekunder 1555200 * 0,66 = 1026432, som lægges til det antal træ du får fra databasen, og så updater du antalTræ med det tal.

Næste gang antal træ udskrives, vil det måske være 2 minutter siden .. og så kører funktionen igen blot med 120 * 0,66
osv..
på den måde bruger du kun energi på at opdatere for de brugere der er relevat..
Og du slipper for noget der skal kører hele tiden
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 11:13 #9
Arne_v - Så får man jo også kun træ 1 gang i timen, men ville jo gerne have det sådan, at man fik træ løbende..

Therealyoda - hm, det kan godt laves (tænker du på, at det skal laves med timestamps?), men giver det så ikke en opdatering af databasen hver gang brugeren er online og for hver gang han skifter side?
- Hvis man så ser på det, så hvis han har 100 stykker træ når han logger af, og først efter 18 dage logger på igen hvor han i mellemtiden er blevet angrebet. Så har angriberen ikke kunnet erobre det træ han burde have haft da brugeren først får råstofferne den dag han logger på igen? Hvis jeg har forstået det rigtigt.
Avatar billede The Real Yoda Juniormester
21. juni 2010 - 11:32 #10
Det kommer vel an på hvordan man laver det ? ..
men jo .. der kommer jo en update hver gang brugeren skifter side.. med mindre du lægger en tidsbegrænsning ind i funktionen .. hvis du vil spare den update ..

du skal jo bare lave en funktion som henter brugerens træ..

hvis du har træTid og træAntal i databasen

så :
Function brugerensTrae(brugerid)
  select træTid og træAntal fra database
  antalSek = dateDiff("S",træTid,now())
  brugerensTrae= (antalSek*0,66)+træAntal
  if antalSek > 600 then
    database update træTid og træAntal
  end if
end Function

På den måde kan du også bruge funktionen når brugeren er offline.. til at se hvor meget træ han har.. eks når du skal udregne hvor meget de andre må snuppe fra ham ..
og når han er online laver han kun en db update hvert 10 minut..
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 11:51 #11
Jeg prøver lige din type funktion af - og giver respons om ikke vildt længe. :)
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 12:24 #12
Okay - har vist nok fået det til, at virke nu..

- Men 1 spørgsmål.. Matematik på min hjemmeside indtil nu er ikke lige hvad jeg har lavet mest af..

Hvordan får jeg den til, at afrunde til nærmeste hele tal når den skal opdatere??
Avatar billede The Real Yoda Juniormester
21. juni 2010 - 12:33 #13
eftersom du kan ha brug for ret store tal, vil jeg tro det smarteste er cdbl()
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 12:44 #14
Øhm..
Jeg har lige prøvet, at bruge cdbl() - men den afrunder da ikke?
Jeg prøvede med: cdbl(5464.564) for, at teste afrundingen - men det giver jo bare 5464.564??
Den skulle gerne gå ind og sige:

Hvis det er >= 5464.5 så runder den op
og hvis det er < 5464.5 så runder den ned

??
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 12:48 #15
Jeg har løst det med en round() funktion.. :)

- Kan du ikke lige smide et svar og få dine point?
Avatar billede The Real Yoda Juniormester
21. juni 2010 - 12:55 #16
Så er der et svar her ..
Avatar billede ASPAmatoer16 Nybegynder
21. juni 2010 - 13:05 #17
Tak for hjælpen.
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

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