undrar lite nu?
om jag läser in ett visst antal poster från en databas. Lopar igenom dessa och för varje post kör jag en funktion som tar minst 5 sek att utföra. Säg nu att det är 100 poster, 500 sek, blir ju nästan 10 minuter..
Är databasen helt låst då under 10 min eller kommer andra användare åt den..
Finns det något annat sätt att göra detta. hade tänkt att köra det på nätterna men jag kan ju ändå inte låsa upp hela databasen för andra användare??
Går inte riktigt att svara på frågan utan att ha mer informationoch kanske lit kodmen spontant:
MS SQL klarar bra mycket mer än 1 ansluing i taget ;). Tänk även på att man inte är ansluten till databasen hela tiden man är på en hemsida (om den inte är riktigt dåligt kodad förstårs) utan bara en bråkdel just då man hämtar eller skriver nått till den.
Är du ändå orolig så kan du hämta ut alla poster du ska använda till en array som du sedan kan loopia igenom och på så sätt ansluter du bara till databasen en gång i nån sekund. Aldrig använt MS SQL men i MySQL heter det GetRows.
Sen i allmänhet så hoppas jag att du stänger databasen ordentigt efter hämtande innan du börjar köra funktioner och liknande så den inte är öppen i onödan.
Att hämta den lilla mängd data tar knappt någon tid alls. Och MS SQL kan som Poffe skriver hantera fler anslutningar samtidigt. Men i princip kodar du så här:
1. Öppnar mot Databasen.
2. Hämtar den data du ska.
3. Stänger kopplingen mot databasen.
4. Presenterar den data du hämtade.
Vad är det för funktion du ska köra? Ligger den i databasen eller utanför? Du får visa mer kod för att få bättre hjälp.
förstå inte varför du vill "söla" ner din funktion ännu mer... du kan typ ta for i = 0 to 100000 så blir det en "fördröjning"... men finns inget "wait" liknande i ASP.
Din funktion kommer ju att köras först innan din update sats körs. Fördröjningen blir ju så lång som din funktion gör den. Förstår inte vad du vill åstadkomma? Varför vill du ha en fördröjning?
Kan du "måla" upp scenariot om varför du vill ha en fördröjning?
Jag loggar besökarna på min sida.. också tänkte jag att på natten ska det köras ett skript som gör en nslookup på varje besök som varit under dagen...
scriptet för nslookup gör frågan mot ripe men man får väll inte ställa flera frågor för tätt där, så jag vill ha en fördröjning..
sen fanns det en annan lösning och det var att använda en komponent, den komponenten då var en demo och därfär ger den en fördröjning på 5 sek för varje fråga: därav tiden det kommer ta att öra igenom alla poster..
Lite jobbigt och då man måste få dom på webhotellet att installera denna komponent..
Då skulla jag nog kolla om jag redan slagit upp adressen tidigare och hämta värdet därifrån innan jag slår upp den igen hos ripe. Varför inte köra det direkt efter inloggning? Då sprider du ut det över tiden. Eller loggar alla in samtidigt?
Har du många slagningar spelar nog inte en 5sekunder fördröjning så stor roll då antalet slagningar förmodligen sätter stopp.
jag vill ju inte att det ska skapa någon fördröjning när besökaren kommer till sidan. det är ingen inloggning på sidan utan bara besöksregistrering..
kan du beskriva lite mer hur jag ska gå tilllväga??
om man skulle göra som jag tänkt. ska koden vara som jag har gjort den eller ska jag bara läsa en post köra rs.close och sedan UPDATE och sedan börja om igen med en fråga som tar ut en post??
Har du inte möjlighet att få loggarna från ditt webhotell eller använda tex http://webstats.motigo.com
Att logga varje besök genom kod igen känns lite onödigt eftersom den informationen förmodligen loggas av webservern i sig.
ähh jag har ju redan gjort det mesta nu. Nu vill jag bara lägga till denna funktionen också.. Alltså så jag har leverantören och landet i loggen...
men till frågan igen då..
vilken kod är bäst eller ingen alls??
do until rs.eof
con.execute("update set ns="& funktionSomReturneraVärde() &" where id="& rs("id") &")
loop
rs.close
ovan kod då. Är databasen helt låst tills det jag kör rs.close eller kan det fortfarande skrivas till den om det t.ex kommer en beesökare.. Kanske måste ändra script timeout när jag kör detta??
eller ska man köra:
SQL......
set rs = execute.....
id= rs("id")
rs.close
con.execute("update set ns="& funktionSomReturneraVärde() &" where id="& id &")
och sen loop runt ovanstående, eller inget av ovanstående förslag.. öppen för andra ideer...
Jag vet inte om det är aktuellt för dig, men ett alternativ som kanske passar är att lägga funktionen i global.asa.
SUB Session_OnEnd
-- session("databasePath") = ""
-- Application.Lock
-- application("ActiveUsers") = application("ActiveUsers") - 1
-- Application.UnLock
END SUB
Då har du fortfarande all data från användaren, men samtidigt sölar det inte ner "närvarokänslan" för respektive användare. Dom lämnar hemsidan, stänger fönstret eller vad det nu är.
Som sagt, jag vet inte om det skulle fungera i just ditt fall.
Först varför vill du använda ripe's dns servrar, din ISP's servrar fungerar lika bra?
I PHP finns ip-namnet och ip-nummret i variabler som skapas när http anropet görs, finns det inget liknande i ASP som du kan använda och spara direkt i databasen vid anropet?
Du beskriver ju inte vad du gör speciellt ingående men jag hade skapat en tabell där jag lagrade ipadresserna och slog upp dem; på så sätt behöver du inte slå upp samma adress flera gånger.
Jo jag loggar besökaren när dom kommer till hemsidan, då sparar jag info som, tid,språk, platform m.m. samt ip...
på natten vill jag schemalägga ett script som kollar alla poster som varit under dagen där fältet dns är tomt, är det så så ska det köras en fråga mot ripe för att ta reda på leverantören och landet och spara dessa under dessa fält i databasen..
jag vill bara inte att databasen blir helt låst när detta script körs om detta nu skulle ta en timme att köra?? måste ju ändå kunna registrera besök i databsen fast scriptet körs???
jag har inte möjlighet att installera komponent på webhotellet så då var det ju bra med ett script som körde mot ripe..
Som sagt, MS SQL klarar mer än en (1) samtidig anslutning så det är inga problem.
Precis som här på wF är det ju inte bara en som kan använda databasen per gång, då skulle man hamna i kö väldigt ofta, ja varje gång som nån laddar en tråd eller sparar ett inlägg eller navigerar bland de olika forumen.
Men jag vill påpeka att man är helt fel ute om man skriver ASP-sidor som tar 1 timme att köra igenom.
Som sagt, varför inte utföra denna operation för varje användare direkt när sessionen tar slut?
jag har använt mig av session_Onend för att skriva in tid i databsen då besökaren lämnar för att räkna ut besöks tid men tycker inte det verka vara så pålitligt...
´men jag kanske har fel??
sen har ju problemet att man inte kunde ställa frågorna för tätt mot ripe, utan man skulle göra det mot en viss port tror jag det var. Har nte kunnat hittat något om hur man gör det???