sql >> Databasteknik >  >> RDS >> Sqlserver

Eventuella nackdelar med att använda ExecuteReaderAsync från C# AsyncCTP

Jag håller inte med Ricka i detta. Async DB-kommandon är inte bara bra, de är avgörande för att uppnå skalning, genomströmning och latens. Hans invändning om upprampningstiden för trådpoolen gäller endast en webbserver som upplever låga trafikvolymer.

I en situation med hög trafik (vilket är den enda som spelar roll), behöver trådpoolen inte vänta på att "injicera" nya trådar. Att göra SQL-kommandon asynkront är viktigt inte bara ur synvinkeln av webbserverförfrågningar/trådars hälsa, utan också ur synvinkeln av total livslängd/fördröjning:okorrelerade DB-anrop kan göras parallellt, i motsats till sekventiellt. Bara detta resulterar vanligtvis i dramatiska förbättringar av latensen för HTTP-förfrågan som upplevs av användaren. Med andra ord, dina sidor laddas snabbare.

Ett råd dock:SQL Command är inte riktigt asynkront förrän du aktiverar Asynchronous Processing=true på anslutningssträngen. Även om detta inte är inställt (och som standard inte är det, Redigera:börjar med .NET Framework <4.5. Asynchronous Processing behövs inte längre ) dina "asynkrona" anrop till BeginExecuteReader är inget annat än en bluff, kommer samtalet att starta en tråd och blockera det tråd. När sann asynkbehandling är aktiverad i anslutningssträngen då är samtalet verkligen asynkront och återuppringningen baseras på IO-komplettering.

Ett varningens ord:ett asynkront SQL-kommando slutförs så snart den första resultatet returneras till klienten och informationsmeddelanden räknas som resultat.

create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end

Du har förlorat alla fördelar med asynkronisering. print skapar ett resultat som skickas tillbaka till klienten, vilket slutför asynkroniseringskommandot och exekveringen på klienten återupptas och fortsätter med 'reader.Read()'. Nu det kommer att blockera tills den komplexa frågan börjar ge resultat. Du frågar 'vem som sätter print i proceduren?' men print kan vara förklädd i något annat, kanske något så oskyldigt som en INSERT som körs utan först utfärdar en SET NOCOUNT ON .



  1. SQL Developer kan ansluta Oracle Database 12c med TNS men kan inte ansluta till basic

  2. MySQL-databas med unika fält ignorerade slututrymmen

  3. Läs och importera CSV-filer i Oracle PL/SQL effektivt

  4. MySqlCommand-anropsfunktion