Nie zgadzam się w tej sprawie z Ricką. Polecenia Async DB są nie tylko dobre, ale mają kluczowe znaczenie dla osiągnięcia skali, przepustowości i czas oczekiwania. Jego zastrzeżenie dotyczące czasu narastania puli wątków dotyczy tylko serwera WWW, na którym ruch jest niewielki.
W sytuacji dużego ruchu (która jest jedyną, która ma znaczenie), pula wątków nie będzie musiała czekać na „wstrzyknięcie” nowych wątków. Wykonywanie poleceń SQL asynchronicznie jest ważne nie tylko z punktu widzenia stanu żądań/wątków serwera WWW, ale także z punktu widzenia całkowitego czasu życia/opóźnienia żądania:nieskorelowane wywołania bazy danych mogą być wykonywane równolegle, a nie sekwencyjnie. Samo to skutkuje zwykle znaczną poprawą opóźnienia żądania HTTP, jakiego doświadcza użytkownik. Innymi słowy, Twoje strony ładują się szybciej.
Jedna rada:polecenie SQL nie jest naprawdę asynchroniczne, dopóki nie włączysz Asynchronous Processing=true
w ciągu połączenia. Chociaż nie jest to ustawione (i domyślnie nie jest, Edytuj:zaczynając od .NET Framework <4.5. Asynchronous Processing
nie jest już wymagane
) Twoje „asynchroniczne” wywołania BeginExecuteReader
są tylko fikcją, połączenie uruchomi wątek i zablokuje to wątek. Gdy włączone jest prawdziwe przetwarzanie asynchroniczne w ciągu połączenia wtedy wywołanie jest naprawdę asynchroniczne, a wywołanie zwrotne jest oparte na zakończeniu IO.
Słowo ostrzeżenia:asynchroniczne polecenie SQL kończy się zaraz po pierwszym wynik wraca do klienta, a wiadomości informacyjne liczą się jako wynik.
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
Straciłeś wszystkie korzyści płynące z asynchronii. print
tworzy wynik, który jest wysyłany z powrotem do klienta, który kończy polecenie asynchroniczne, a wykonanie na kliencie jest wznawiane i kontynuowane z „reader.Read()”. Teraz to będzie blokować, dopóki złożone zapytanie nie zacznie generować wyników. Pytasz 'kto umieszcza print
w procedurze?” ale print
może być zamaskowany w coś innego, być może coś tak niewinnego jak INSERT
który wykonuje bez pierwsze wydanie SET NOCOUNT ON
.