Jeg har det problem at jeg midt under en eksekvering af en ASP side får flg. fejl.
“Microsoft OLE DB Provider for SQL Server error '80004005'
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied. “
ASP siden gør det, at den selecter fra en table (15.000 rækker), og opdaterer resultatet i en anden tabel. Det er forskelligt hvor langt ASP siden kommer, nogle gange når den 70%, andre gang 80% af alle rækkerne før fejlen kommer.
------ Kode eksempel ----- SELECT * fra tblScores ORDER by IntScore SET RS = dbConn.execute(SQL)
I = I + 1
Do while not rs.eof “Update tblUsers set intPos = ” & I & “ WHERE idUser =” & rs(“idUser”) dbConn.execute(SQL) Rs.movenext Loop -----------------------------
------ Server setup -------- Server 1 Fujitsu-Siemens RX300 Server(Dual 2,8 Xeon, 1 Gb Ram, 72 Gb SCSI Raid 1) Windows 2003 Web Server MDAC 2.8
Server 2 Fujitsu-Siemens RX300 Server(Dual 2,8 Xeon, 1 Gb Ram, 72 Gb SCSI Raid 1) Windows 2003 standart server Microsoft SQL server 2000 SP3a MDAC 2.8
Har du mulighed for at prøve at køre queryen lokalt fra ASP? Det kunne umiddelbart godt lyde som om du har et netkort, som ikke opfører sig som det skal.
Har skiftet netkort. I begge maskiner, så de nu kører 1 Gbit imellem de 2 servere.
Hvilket ikke har hjulpet. ... suk
Når fejlen opstår, er det som om at IIS serveren (som afvikler ASP koden) ikke kan få kontakt til SQL serveren i ca. 30 sek til 1 minut. Men jeg kan godt på samme tid få adgang til SQL serveren via Enterprise Manager og Query Analyzer imens.
Så jeg er kommet frem til at fejlen må ligge på ASP/IIS maskinen, men det er en helt ren installation af Windows Server 2003.
Jeg har på et tidspunkt læst om en fejl i .NET der gjorde, at transaktioner pludselig hang - noget med, at .NETs pooling.
Check lige data i master.dbo.sysprocesses - eller brug Current Activity under Management folderen i Enterprise Manager. Du må *ikke* have åbne transaktioner der står markeret som "sleeping". Evt kom med et dump af din current activity så vi kan se hvad der sker på din boks mens fejlen opstår.
For en god ordens skyld - check også at din database ikke har shrink / autoclose slået til - og at din TEMPDB ikke fysisk er placeret sammen med database logfiler og din windows swapfil. Alt sammen noget der får performance til at hamre i gulvet.
Det er også være at kigge på, om du har slået parallel query til. Ved komplekse queries kommer man ofte i situationer hvor al kraft bliver brugt til at synkronisere arbejdet mellem cpu'erne - administrationen af querien kan bogstavelig talt blokere for data.
Det er nemt og hurtigt at fjerne - i Enterprise Manager højreklikker du på serveren, vælger properties og på fanen Processor har du mulighed for at sætte Use N processor(s) - sæt N til 1 og prøv om det løser problemet. Gør det det ikke, kan du hurtigt sætte det tilbage til "use all available".
NB: Det forhindrer ikke at SQL Server bruger alle cpu'er - det forhindrer blot at én query kører over flere cpu'er.
Sidst - du kan køre en profilertrace mod din sql server mens du provokerer fejlen frem. Profilertracen kan så fortælle præcis hvad der sker på serveren og hvad kommunikationen mellem klienten og serveren indeholder. Det er nok det værktøj jeg ville starte med, hvis jeg sad som administrator.
Problemet kan være, at det at fyre 15.000 separate transaktioner af i et loop smadrer noget buffer / connection setup i ASP. Whatever. Derudover, det er ikke særligt effektivt at gøre det som du viser - og SQL Server har i øvrigt en query timeout på 10 minutter som default...
Dit kode eksempel ovenfor kan skrives om til en rimelig kompakt procedure som vist her.
create procedure dbo.UpdateTblUsers as begin select identity(int,1,1) as lnr, iduser into #temp from dbo.intScore
update dbo.tblUsers set intPos = t.lnr from dbo.tblusers as u inner join #temp as t on u.iduser = t.iduser end
Det giver så et enkelt kald i ASP
<% SQL = "exec dbo.updatetblusers" SET RS = dbConn.execute(SQL) %>
Jeg kan naturligvis ikke teste det - men jeg gætter på, at du både får fjernet fejlen og bedre performance - 15.000 rækker burde kun tage få sekunder at opdatere.
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.