/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Skrivning af filer
Fra : Jesper Nielsen


Dato : 17-10-01 22:06

Jeg har et VBScript kørende under Windows Script Host med følgende funktion:

Function f_UpdateMemberCount()
'''''''''''''''''''''''''''''''''''''''''''
' Objects
'''''''''''''''''''''''''''''''''''''''''''
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Conn = CreateObject("ADODB.Connection")
Conn.Open strConnect

'''''''''''''''''''''''''''''''''''''''''''
' Get member count
'''''''''''''''''''''''''''''''''''''''''''
SQL = "SELECT COUNT(*) AS lngCount FROM Users_List WHERE Status IN
(20,99,100);"
Set Qry = Conn.Execute(SQL)

'''''''''''''''''''''''''''''''''''''''''''
' Write Include File
'''''''''''''''''''''''''''''''''''''''''''
incMemberPath = IncludePath & "\incStats\incMembers.asp"
Set WriteFile = FSO.OpenTextFile(incMemberPath,2,True)
WriteFile.WriteLine("<%" & vbCrLf & " Dim MemberCount" & vbCrLf & vbCrLf
& " MemberCount = " & Qry("lngCount") & vbCrLf & "%>")

'''''''''''''''''''''''''''''''''''''''''''
' Close Objects
'''''''''''''''''''''''''''''''''''''''''''
Conn.Close
Set Conn = Nothing
Set FSO = Nothing
WriteFile.Close
Set WriteFile = Nothing
End Function

Scriptet Looper på følgende måde:

Do
Call f_UpdateMemberCount()
WScript.Echo Now()
WScript.Sleep 5000
Loop

Problemet er bare, at filen bliver inkluderet på et ret belastet site,
hvorfor jeg ofte får fejlen
d:\scripts\membercount.vbs(47,3) Microsoft VBScript compilation error:
Permission denied.

Linie 47 indeholder
Set WriteFile = FSO.OpenTextFile(incMemberPath,2,True)

Det betyder vel, at filen er åben af IIS'en i forvejen, hvorfor den ikke kan
få lov til at åbne filen for write access.
Er der nogen der har et workaround til dette problem?

/jesper/



 
 
Peter Thers (18-10-2001)
Kommentar
Fra : Peter Thers


Dato : 18-10-01 07:19

Måske kunne du tilføje tidspunktet i filnavnet, når du genererer
inkludefilen?
Når scriptet så kører næste gang er det et nyt tidspunkt og et nyt filnavn.
Der hvor du includerer filen tester du på filnavnet og tager den nyeste.
Fordelen er at du ikke prøver at åbne en fil der bliver brugt af IIS.
Problemet ved denne metode er at dine data kan være max 5000 (ms eller s? )
gamle, og at du får genereret mange .inc filer som du skal sørge for at
slette igen...
--
/Peter Thers

http://www.oenskelister.dk

"Jesper Nielsen" <jn@nielsenit.dk> wrote in message
news:Cqmz7.2645$5v1.259264@news010.worldonline.dk...
> Jeg har et VBScript kørende under Windows Script Host med følgende
funktion:
>
> Function f_UpdateMemberCount()
> '''''''''''''''''''''''''''''''''''''''''''
> ' Objects
> '''''''''''''''''''''''''''''''''''''''''''
> Set FSO = CreateObject("Scripting.FileSystemObject")
> Set Conn = CreateObject("ADODB.Connection")
> Conn.Open strConnect
>
> '''''''''''''''''''''''''''''''''''''''''''
> ' Get member count
> '''''''''''''''''''''''''''''''''''''''''''
> SQL = "SELECT COUNT(*) AS lngCount FROM Users_List WHERE Status IN
> (20,99,100);"
> Set Qry = Conn.Execute(SQL)
>
> '''''''''''''''''''''''''''''''''''''''''''
> ' Write Include File
> '''''''''''''''''''''''''''''''''''''''''''
> incMemberPath = IncludePath & "\incStats\incMembers.asp"
> Set WriteFile = FSO.OpenTextFile(incMemberPath,2,True)
> WriteFile.WriteLine("<%" & vbCrLf & " Dim MemberCount" & vbCrLf &
vbCrLf
> & " MemberCount = " & Qry("lngCount") & vbCrLf & "%>")
>
> '''''''''''''''''''''''''''''''''''''''''''
> ' Close Objects
> '''''''''''''''''''''''''''''''''''''''''''
> Conn.Close
> Set Conn = Nothing
> Set FSO = Nothing
> WriteFile.Close
> Set WriteFile = Nothing
> End Function
>
> Scriptet Looper på følgende måde:
>
> Do
> Call f_UpdateMemberCount()
> WScript.Echo Now()
> WScript.Sleep 5000
> Loop
>
> Problemet er bare, at filen bliver inkluderet på et ret belastet site,
> hvorfor jeg ofte får fejlen
> d:\scripts\membercount.vbs(47,3) Microsoft VBScript compilation error:
> Permission denied.
>
> Linie 47 indeholder
> Set WriteFile = FSO.OpenTextFile(incMemberPath,2,True)
>
> Det betyder vel, at filen er åben af IIS'en i forvejen, hvorfor den ikke
kan
> få lov til at åbne filen for write access.
> Er der nogen der har et workaround til dette problem?
>
> /jesper/
>
>



Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 11:30

> Måske kunne du tilføje tidspunktet i filnavnet, når du genererer
> inkludefilen?
> Når scriptet så kører næste gang er det et nyt tidspunkt og et nyt
filnavn.
> Der hvor du includerer filen tester du på filnavnet og tager den nyeste.
> Fordelen er at du ikke prøver at åbne en fil der bliver brugt af IIS.
> Problemet ved denne metode er at dine data kan være max 5000 (ms eller
s? )
> gamle, og at du får genereret mange .inc filer som du skal sørge for at
> slette igen...

Problemet her vil være, at der bliver oprettet en FSO hver gang der bliver
requestet en side. Så kan jeg vist lige så godt oprette en ADODB.Connection
istedet.
Så ville den mest optimale løsning nok være, at jeg lader mit VBScript tælle
antallet af records i Users_Home op og skrive tallet ind i en tabel, og så
lade min nu faste include fil læse dette tal her fra. Eller hvad?

/jesper/



Jonathan Stein (18-10-2001)
Kommentar
Fra : Jonathan Stein


Dato : 18-10-01 10:56

Jesper Nielsen wrote:

> Problemet er bare, at filen bliver inkluderet på et ret belastet site,
> hvorfor jeg ofte får fejlen
> d:\scripts\membercount.vbs(47,3) Microsoft VBScript compilation error:
> Permission denied.

Jeg gætter på, at skrivning til filen er meget begrænset i forhold til
læsningen. Så skal du kigge på Application.Lock (og Application.Unlock). Dermed
kan du låse applikationen lige inden du åbner filen - og frigive den umiddelbart
efter filen er lukket.
Alle requests, der skal læse filen, bliver så forsinket de formentlig få ms
det tager at skrive filen.

M.v.h.

Jonathan

--
Start med PHP, Perl eller JSP uden at omskrive al din gamle ASP-kode.
jsp-hotel.dk tilbyder nu Chili!Soft ASP på alle hoteller.
http://www.jsp-hotel.dk/




Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 11:28

> Jeg gætter på, at skrivning til filen er meget begrænset i forhold til
> læsningen. Så skal du kigge på Application.Lock (og Application.Unlock).
Dermed
> kan du låse applikationen lige inden du åbner filen - og frigive den
umiddelbart
> efter filen er lukket.

Hvordan låser jeg min IIS applikation fra et VBScript der kører under
Windows Script Host?

/jesper/



Jonathan Stein (18-10-2001)
Kommentar
Fra : Jonathan Stein


Dato : 18-10-01 20:47

Jesper Nielsen wrote:

> Hvordan låser jeg min IIS applikation fra et VBScript der kører under
> Windows Script Host?

Requester en .asp side? (Hvor stor en del af koden, der skal flyttes til
..asp siden, kommer an på de konkrete forhold).

M.v.h.

Jonathan

--
Start med PHP, Perl eller JSP uden at omskrive al din gamle ASP-kode.
jsp-hotel.dk tilbyder nu Chili!Soft ASP på alle hoteller.
http://www.jsp-hotel.dk/




Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 21:00

> Requester en .asp side? (Hvor stor en del af koden, der skal flyttes til
> .asp siden, kommer an på de konkrete forhold).

Hmm... det ser ud til, at det ville være lettere at lave en simpel side, der
automatisk reloader hvert 5. sekund vha. javascripts window.setTimeout, og
så køre denne side i en IE på serveren...

/jesper/



Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 21:01

> Hmm... det ser ud til, at det ville være lettere at lave en simpel side,
der
> automatisk reloader hvert 5. sekund vha. javascripts window.setTimeout, og
> så køre denne side i en IE på serveren...

Og så selvfølgelig skrive tallet til en application variabel



Jonathan Stein (18-10-2001)
Kommentar
Fra : Jonathan Stein


Dato : 18-10-01 21:20

Jesper Nielsen wrote:

> Og så selvfølgelig skrive tallet til en application variabel

- Jeg ved dog ikke, om man kan distribuere værdier i application-objektet
mellem flere servere, hvis I senere skulle få brug for dette.

M.v.h.

Jonathan

--
Start med PHP, Perl eller JSP uden at omskrive al din gamle ASP-kode.
jsp-hotel.dk tilbyder nu Chili!Soft ASP på alle hoteller.
http://www.jsp-hotel.dk/



Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 21:54

> - Jeg ved dog ikke, om man kan distribuere værdier i
application-objektet
> mellem flere servere, hvis I senere skulle få brug for dette.

Det mener jeg bestemt ikke, at man kan. Men så må vi jo bare lade scriptet
køre på alle servere - det burde jo sådan set ikke være noget problem.
Ellers bliver det DB løsningen.

/jesper/



Anders Holbøll (18-10-2001)
Kommentar
Fra : Anders Holbøll


Dato : 18-10-01 12:48

Jesper Nielsen wrote:
>
> Jeg har et VBScript kørende under Windows Script Host med følgende funktion:
>
> [caching ved at genererer en asp-fil, der includes]

Det ser ikke ud som en god måde at (mis)bruge asp. Når du har genereret
en nye fil, skal asp fortolkeren jo genindlæse alle de scripts, som
benytter includefilen. Hvorfor benytter du ikke blot
application-objektet? Iøvrigt burde en simpel optælling ikke være så
langsom. Har du relevante indeks på din tabel?

--
Anders

Jesper Nielsen (18-10-2001)
Kommentar
Fra : Jesper Nielsen


Dato : 18-10-01 14:25

Hej Anders

> Det ser ikke ud som en god måde at (mis)bruge asp. Når du har genereret
> en nye fil, skal asp fortolkeren jo genindlæse alle de scripts, som
> benytter includefilen. Hvorfor benytter du ikke blot
> application-objektet? Iøvrigt burde en simpel optælling ikke være så
> langsom. Har du relevante indeks på din tabel?

Problemet er blot, at jeg så skal oprette en forbindelse til databasen i
include filen, hvilket jeg helst undgår - af performancehensyn vil jeg gerne
undgå så mange objekter som muligt, da der godt kan gå hen og blive mange
requests pr. sekund.

Jeg havde dog tænkt på at lade mit VBScript køre hvert 5. sekund og lade den
opdatere en tabel med kun én record, der indeholder antallet af medlemmer
der er logget på det påsældende tidspunkt. Det kan godt være, at det er den
mest optimale løsning.

Jeg vil under ingen omstændigheder lade HVER request løbe alle brugerne
igennem - her har jeg for dårlige erfaringer. Vi skal gerne kunne klare min.
1000-1500 samtidige brugere pr. server. Vi bruger ikke sessions, men derimod
cookies med forskellige bitflag, hvormed vi let vil kunne tilføje flere
servere i et cluster bag en loadbalancer.

Men lad mig endelig vide, om du har andre og bedre forslag - applikationen
skal optimeres så meget som muligt, så any help appreciated

/jesper/



Anders Holbøll (19-10-2001)
Kommentar
Fra : Anders Holbøll


Dato : 19-10-01 10:34

Jesper Nielsen wrote:
> > Det ser ikke ud som en god måde at (mis)bruge asp. Når du har
> > genereret en nye fil, skal asp fortolkeren jo genindlæse alle
> > de scripts, som benytter includefilen. Hvorfor benytter du
> > ikke blot application-objektet? Iøvrigt burde en simpel
> > optælling ikke være så langsom. Har du relevante indeks på
> > din tabel?
>
> Problemet er blot, at jeg så skal oprette en forbindelse til
> databasen i include filen, hvilket jeg helst undgår - af
> performancehensyn vil jeg gerne undgå så mange objekter som
> muligt, da der godt kan gå hen og blive mange requests pr.
> sekund.

Jeg kan ikke se hvad de to ting (kode ligger i include fil og antallet
af database objekter) har med hinanden at gøre. Normalt benytter jeg
masser af includefiler, men benytter kun en databaseforbindelse og et
recordset.

> Jeg havde dog tænkt på at lade mit VBScript køre hvert 5.
> sekund og lade den opdatere en tabel med kun én record, der
> indeholder antallet af medlemmer der er logget på det
> påsældende tidspunkt. Det kan godt være, at det er den
> mest optimale løsning.

Hvorfor ikke blot noget i stil med (Der bør naturligvis laves nogle
check for om to processer beregner samme ting samtigigt):

Function GetOnlineCount
Dim Value
If GetCache("OnlineCount", 60, Value) Then
Value = CreateOnlineCount
Call SetCache("OnlineCount", Value)
End If
GetOnlineCount = Value
End Function

Function CreateOnlineCount
SQL = _
"SELECT COUNT(*) AS lngCount " & _
"FROM Users_List " & _
"WHERE Status IN (20,99,100);"
Set Qry = Conn.Execute(SQL)
CreateOnlineCount = Qry(0)
Qry.Close
Set Qry = Nothing
End Function

Function GetCache(ByVal Key, ByVal MaxAge, ByRef Value)
Dim Updated
Updated = Application("Cache_" & Key & "_Updated")
Value = Application("Cache_" & Key & "_Value")
GetCache = False
If Not IsDate(Updated) Then
GetCache = True
ElseIf DateDiff("s", Updated, Now) > MaxAge Then
GetCache = True
End If
End Function

Sub SetCache(ByVal Key, ByRef Value)
Application.Lock
Application("Cache_" & Key & "_Updated") = Now
Application("Cache_" & Key & "_Value") = Value
Application.UnLock
End Sub

--
Anders

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408855
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste