Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Qualsiasi svantaggio dell'utilizzo di ExecuteReaderAsync da C# AsyncCTP

Non sono d'accordo con Ricka su questo. I comandi Async DB non sono solo buoni, ma sono fondamentali per ottenere scalabilità, velocità effettiva e latenza. La sua obiezione sul tempo di accelerazione del pool di thread si applica solo a un server Web con bassi volumi di traffico.

In una situazione di traffico elevato (che è l'unica che conta), il pool di thread non dovrà attendere l'"iniezione" di nuovi thread. L'esecuzione dei comandi SQL in modo asincrono è importante non solo dal punto di vista dell'integrità delle richieste/thread del server Web, ma anche dal punto di vista della durata/latenza totale delle richieste:le chiamate DB non correlate possono essere eseguite in parallelo, anziché in sequenza. Questo da solo si traduce in genere in notevoli miglioramenti nella latenza della richiesta HTTP come sperimentato dall'utente. In altre parole, le tue pagine si caricano più velocemente.

Un consiglio però:SQL Command non è veramente asincrono finché non abiliti Asynchronous Processing=true sulla stringa di connessione. Anche se non è impostato (e per impostazione predefinita non lo è, Modifica:a partire da .NET Framework <4.5. Asynchronous Processing non è più richiesto ) le tue chiamate "asincrone" a BeginExecuteReader non sono altro che una farsa, la chiamata avvierà un thread e bloccherà quello filo. Quando la vera elaborazione asincrona è abilitata nella stringa di connessione quindi la chiamata è veramente asincrona e la richiamata si basa sul completamento dell'IO.

Un avvertimento:un comando SQL asincrono viene completato non appena il primo il risultato viene restituito al client e i messaggi informativi contano come risultato.

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

Hai perso tutti i vantaggi dell'asincrono. La print crea un risultato che viene inviato al client, che completa il comando asincrono e l'esecuzione sul client riprende e continua con 'reader.Read()'. Ora quello si bloccherà fino a quando la query complessa non inizierà a produrre risultati. Chiedi a 'chi mette print nella procedura?' ma la print può essere mascherato da qualcos'altro, forse qualcosa di innocente come un INSERT che viene eseguito senza prima emissione di un SET NOCOUNT ON .