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" <j...@nielsenit.dk> wrote in message
news:Cqmz7.2645$5v1.2...@news010.worldonline.dk...
> 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/
Hvordan låser jeg min IIS applikation fra et VBScript der kører under
Windows Script Host?
/jesper/
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/
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
> 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/
> 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).
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/
Og så selvfølgelig skrive tallet til en application variabel
> 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.
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/
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