Avatar billede riishoj Nybegynder
06. december 2007 - 15:55 Der er 12 kommentarer

Fejl ved opdatering

Nedenstående script bliver opdateret hvert 10 sek. ved hjælp af et javascript. Det fungerer fint, sålænge kun en bruger kører scriptet, men når to brugere er på samtidig, bliver der på et eller andet tidspunkt returneret en null-værdi til den ene bruger.

Jeg tror, at jeg har fundet en forklaring på problemet. Som sagt, så fejler javascriptet kun, når det bliver kørt af mere end én computer. Jeg har lagt mærke til, at opdateringsfrekvensen, som er sat til 10000, ikke altid er præcis 10 sekunder, men sommetider 1 til 2 sekunder mere. Dermed vil opdateringstidspunktet på 2 computere på et eller andet tidspunkt blive det samme, eller næsten det samme, og det vil vel betyde, at der på den ene computer bliver foretaget et databasekald samtidig med, at den anden computer er i gang med at afvikle et tilsvarende kald. Det medfører så, at der bliver returneret en null-værdi fra det ene script med deraf følgende fejl i javascript.

Hvis jeg sætter opdateringstiden til f.eks. 20 sekunder, så kører scriptene meget længere uden at fejle, men så er sandsynligheden for at de to scripts "rammer" hinanden jo også mindre.

Jeg kan ikke få javascriptet til at opdatere igen efter fejlen. Derfor er spørgsmålet: Kan jeg lægge noget ind i asp-scriptet, så jeg undgår fejlen?

Koden til scriptet kommer her.

<%
response.expires=-1
response.contenttype="text/xml"

on error resume next
Set Conn = Server.CreateObject("ADODB.Connection")
MdbFilePath = Server.MapPath("mindb.mdb")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MdbFilePath & ";"

strSQL = "SELECT * FROM tblTurbData ORDER by AccessTimeStamp desc"
set rs = conn.execute(strSQL)

If err <> 0 then
response.write(err.description)
Set rs = Nothing
Set Conn = Nothing


Else
If Not rs.eof then
RotRpm = rs("RotRpm")
GenRpm = rs("GenRpm")
TurbClock = rs("Now()")
GearTmp = rs("GearTmp")
Gen1Tmp = rs("Gen1Tmp")
Gen2Tmp = rs("Gen2Tmp")
Pwr = rs("Pwr")
Status = rs("Status")
Frq = rs("Frq")
Rvolt = rs("Rvolt")
Svolt = rs("Svolt")
Tvolt = rs("Tvolt")
Rcurr = rs("Rcurr")
Scurr = rs("Scurr")
Tcurr = rs("Tcurr")
RctPwr = rs("RctPwr")
EngGen1Sub = rs("EngGen1Sub")
EngGen2Sub = rs("EngGen2Sub")
SubIaltkW = EngGen1Sub+EngGen2Sub
EngGen1Tot = rs("EngGen1Tot")
EngGen2Tot = rs("EngGen2Tot")
TotIaltkW = FormatNumber(EngGen1Tot+EngGen2Tot,0)
ProdTidGen1Sub = rs("ProdTidGen1Sub")
ProdTidGen2Sub = rs("ProdTidGen2Sub")
ProdTidSubIaltTimer = ProdTidGen1Sub+ProdTidGen2Sub
ProdTidGen1Tot = rs("ProdTidGen1Tot")
ProdTidGen2Tot = rs("ProdTidGen2Tot")
ProdTidTotIaltTimer = ProdTidGen1Tot+ProdTidGen2Tot
YawTim = rs("YawTim")
Wind = rs("Wind")
AmbTmp = rs("AmbTmp")

'Vindrose
interval = Cint(rs("YawTim"))
if interval > 10 and interval <= 34 then
billede = "images/kompasrose_NNE.gif"
elseif interval > 34 and interval <= 56 then
billede ="images/kompasrose_NE.gif"
elseif interval > 56 and interval <= 79 then
billede ="images/kompasrose_ENE.gif"
elseif interval > 79 and interval <= 101 then
billede ="images/kompasrose_east.gif"
elseif interval > 101 and interval <= 124 then
billede ="images/kompasrose_ESE.gif"
elseif interval > 124 and interval <= 146 then
billede ="images/kompasrose_SE.gif"
elseif interval > 146 and interval <= 169 then
billede ="images/kompasrose_SSE.gif"
elseif interval > 169 and interval <= 191 then
billede ="images/kompasrose_south.gif"
elseif interval > 191 and interval <= 214 then
billede ="images/kompasrose_SSW.gif"
elseif interval > 214 and interval <= 236 then
billede ="images/kompasrose_SW.gif"
elseif interval > 236 and interval <= 259 then
billede ="images/kompasrose_WSW.gif"
elseif interval > 259 and interval <= 281 then
billede ="images/kompasrose_west.gif"
elseif interval > 281 and interval <= 304 then
billede ="images/kompasrose_WNW.gif"
elseif interval > 304 and interval <= 326 then
billede ="images/kompasrose_NW.gif"
elseif interval > 326 and interval <= 349 then
billede ="images/kompasrose_NNW.gif"
elseif interval > 349 or interval <= 11 then
billede ="images/kompasrose_north.gif"
end if



response.write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.write("<winddata>")
response.write("<rotrpm>Omdrejninger "&RotRpm&" pr. min.</rotrpm>")
response.write("<genrpm>Omdrejninger "&GenRpm&" pr. min</genrpm>")
response.write("<turbclock>Vindmølleur "&Now()&"</turbclock>")
response.write("<geartmp>Temp. "&GearTmp&" &#176;C</geartmp>")
response.write("<status>Status "&Status&" V</status>")
response.write("<gen1tmp>Temp. store generator "&Gen1Tmp&" &#176;C</gen1tmp>")
response.write("<gen2tmp>Temp. lille generator "&Gen2Tmp&" &#176;C</gen2tmp>")
response.write("<pwr>Nuværende produktion "&Pwr&" kW</pwr>")
response.write("<frq>Frekvens "&Frq&" Hz</frq>")
response.write("<rvolt>R: "&Rvolt&" V</rvolt>")
response.write("<svolt>S: "&Svolt&" V</svolt>")
response.write("<tvolt>T: "&Tvolt&" V</tvolt>")
response.write("<rcurr>R: "&Rcurr&" A</rcurr>")
response.write("<scurr>S: "&Scurr&" A</scurr>")
response.write("<tcurr>T: "&Tcurr&" A</tcurr>")
response.write("<rctpwr>Reaktiv effekt "&RctPwr&" kW</rctpwr>")
response.write("<enggen1sub>Store generator "&EngGen1Sub&" kWh</enggen1sub>")
response.write("<enggen2sub>Lille generator "&EngGen2Sub&" kWh</enggen2sub>")
response.write("<subialtkw>I alt "&SubIaltkW&" kWh</subialtkw>")
response.write("<enggen1tot>Store generator "&EngGen1Tot&" kWh</enggen1tot>")
response.write("<enggen2tot>Lille generator "&EngGen2Tot&" kWh</enggen2tot>")
response.write("<totialtkw>I alt "&TotIaltkW&" kWh</totialtkw>")

response.write("<prodtidgen1sub>Store generator "&ProdTidGen1Sub&" timer</prodtidgen1sub>")
response.write("<prodtidgen2sub>Lille generator "&ProdTidGen2Sub&" timer</prodtidgen2sub>")
response.write("<prodtidsubialttimer>I alt "&ProdTidSubIaltTimer&" timer</prodtidsubialttimer>")

response.write("<prodtidgen1tot>Store generator "&ProdTidGen1Tot&" timer</prodtidgen1tot>")
response.write("<prodtidgen2tot>Lille generator "&ProdTidGen2Tot&" timer</prodtidgen2tot>")
response.write("<prodtidtotialttimer>I alt "&ProdTidTotIaltTimer&" timer</prodtidtotialttimer>")

response.write("<vindrose>&#60;img src='"&billede&"'&#62;</vindrose>")
response.write("<vindretning>Vindretning "&YawTim&" &#176;</vindretning>")
response.write("<vindstyrke>Vindstyrke "&Wind&" m&#8260;s</vindstyrke>")
response.write("<udetemperatur>Udetemperatur "&AmbTmp&" &#176;C</udetemperatur>")
response.write("</winddata>")

Else

response.write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.write("<winddata>")
response.write("<rotrpm>Henter data..</rotrpm>")
response.write("<genrpm>Henter data..</genrpm>")
response.write("<turbclock>Henter data..</turbclock>")
response.write("<geartmp>Henter data..</geartmp>")
response.write("<status>Henter data..</status>")
response.write("<gen1tmp>Henter data..</gen1tmp>")
response.write("<gen2tmp>Henter data..</gen2tmp>")
response.write("<pwr>Henter data..</pwr>")
response.write("<frq>Henter data..</frq>")
response.write("<rvolt>Henter data..</rvolt>")
response.write("<svolt>Henter data..</svolt>")
response.write("<tvolt>Henter data..</tvolt>")
response.write("<rcurr>Henter data..</rcurr>")
response.write("<scurr>Henter data..</scurr>")
response.write("<tcurr>Henter data..</tcurr>")
response.write("<rctpwr>Henter data..</rctpwr>")
response.write("<enggen1sub>Henter data..</enggen1sub>")
response.write("<enggen2sub>Henter data..</enggen2sub>")
response.write("<subialtkw>Henter data..</subialtkw>")
response.write("<enggen1tot>Henter data..</enggen1tot>")
response.write("<enggen2tot>Henter data..</enggen2tot>")
response.write("<totialtkw>Henter data..</totialtkw>")

response.write("<prodtidgen1sub>Henter data..</prodtidgen1sub>")
response.write("<prodtidgen2sub>Henter data..</prodtidgen2sub>")
response.write("<prodtidsubialttimer>Henter data..</prodtidsubialttimer>")

response.write("<prodtidgen1tot>Henter data..</prodtidgen1tot>")
response.write("<prodtidgen2tot>Henter data..</prodtidgen2tot>")
response.write("<prodtidtotialttimer>Henter data..</prodtidtotialttimer>")

response.write("<vindrose>Henter data..</vindrose>")
response.write("<vindretning>Henter data..</vindretning>")
response.write("<vindstyrke>Henter data..</vindstyrke>")
response.write("<udetemperatur>Henter data..</udetemperatur>")
response.write("</winddata>")


End If


rs.close
set rs = nothing
conn.close
Set Conn = Nothing
End If
on error goto 0

%>
Avatar billede cpufan Juniormester
06. december 2007 - 17:00 #1
det skyldes at du løber tør for "forbindelser" til databasen,

serveren skal geares til at bruge flere ressourcer på at etablere db-forbindelser.

det er ikke på grund af sammenfald af "tid", da du jo kun henter ud - du opdaterer ikke på bestående records - hvilket kunne give et potentielt problem.

at tiden varierer, er også et tegn på at serveren er overbelastet med processer.

kig lidt på denne artikel:

http://www.15seconds.com/issue/010814.htm
Avatar billede riishoj Nybegynder
06. december 2007 - 17:19 #2
Jo, jeg opdaterer også bestående records. Et andet program fodrer databasen med data hvert 5 sek. Det er derfor, at mit script skal opdatere hvert 10 sek. for hele tiden at vise de seneste data. Som du måske har gætttet, så er det data fra en vindmølle.

Jeg har lige skimmet artiklen du henviser til. Betyder det, at problemet måske kan løses ved en anden type dbconn.? Eller er der nogle indstillinger på serveren, som skal ændres? Scriptet afvikles på en Windows 2003 server.
Avatar billede cpufan Juniormester
06. december 2007 - 17:35 #3
ja det betyder det.

i første omgang ville jeg trimme serveren,
det gøres i ODBC - så vidt jeg husker
Avatar billede riishoj Nybegynder
06. december 2007 - 17:41 #4
Her er jeg helt blank. Er det noget du har forstand på, eller tror du, at jeg skal stille spørgsmålet i en anden kategori?
Avatar billede cpufan Juniormester
06. december 2007 - 17:45 #5
er det din egen server?
Avatar billede cpufan Juniormester
06. december 2007 - 17:47 #6
Avatar billede riishoj Nybegynder
06. december 2007 - 17:51 #7
ja, serveren er min egen.
Avatar billede cpufan Juniormester
06. december 2007 - 17:57 #8
start > kontrolpanel > administrative tools > data sources >connection pooling

find den rette driver (*.mdb)
enable pooling.

gem og luk det hele
genstart evt. - ved ikke om det er nødvendigt.

Afprøv herefter i et stykke tid,
Hvis det forværrer problemet skyldes det at forbindelserne allerede caches i andre processer, og du skal så disable det igen.
Løser det problemet, ja så har vi fundet ind til sagens kerne.
Avatar billede riishoj Nybegynder
06. december 2007 - 18:13 #9
Du skal foreløbig have tak. Jeg har ikke adgang til serveren hjemmefra, så jeg kan først afprøve dit forslag i morgen. Jeg vender tilbage og håber du stadig er med, hvis jeg får problemer.
Avatar billede cpufan Juniormester
06. december 2007 - 18:55 #10
det er fint ,

jeg skal nok holde lidt øje med dig
Avatar billede riishoj Nybegynder
07. december 2007 - 21:22 #11
Det hjalp desværre ikke at enable pooling. Tilsyneladende gjorde det ingen forskel overhovedet :-(
Avatar billede riishoj Nybegynder
11. december 2007 - 08:02 #12
Anybody?
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