Saya tidak setuju dengan Ricka dalam hal ini. Perintah Async DB tidak hanya bagus, tetapi juga penting dalam mencapai skala, throughput dan latensi. Keberatannya tentang waktu peningkatan kumpulan utas hanya berlaku untuk server web yang mengalami volume lalu lintas rendah.
Dalam situasi lalu lintas tinggi (yang merupakan satu-satunya yang penting), kumpulan utas tidak perlu menunggu 'menyuntikkan' utas baru. Melakukan Perintah SQL secara asinkron penting tidak hanya dari sudut pandang permintaan server web/kesehatan utas, tetapi juga dari sudut pandang total permintaan seumur hidup/latensi:panggilan DB yang tidak berkorelasi dapat dilakukan secara paralel, bukan berurutan. Ini saja biasanya menghasilkan peningkatan dramatis dalam latensi permintaan HTTP seperti yang dialami oleh pengguna. Dengan kata lain, halaman Anda dimuat lebih cepat.
Sebuah nasihat:Perintah SQL tidak benar-benar asinkron sampai Anda mengaktifkan Asynchronous Processing=true
pada rangkaian sambungan. Meskipun ini tidak disetel (dan secara default tidak, Edit:dimulai dengan .NET Framework <4.5. Asynchronous Processing
tidak lagi diperlukan
) panggilan 'asinkron' Anda ke BeginExecuteReader
hanyalah tipuan, panggilan akan meluncurkan utas dan memblokir itu benang. Saat pemrosesan asinkron yang sebenarnya diaktifkan di string koneksi maka panggilan benar-benar asinkron dan panggilan balik didasarkan pada penyelesaian IO.
Sebuah kata peringatan:perintah SQL async selesai segera setelah pertama hasil dikembalikan ke klien, dan pesan info dihitung sebagai hasilnya.
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
Anda telah kehilangan semua manfaat async. print
membuat hasil yang dikirim kembali ke klien, yang menyelesaikan perintah async dan eksekusi pada klien dilanjutkan dan dilanjutkan dengan 'reader.Read()'. Sekarang itu akan memblokir hingga kueri kompleks mulai menghasilkan hasil. Anda bertanya 'siapa yang menempatkan print
dalam prosedur?' tapi print
mungkin disamarkan dalam sesuatu yang lain, mungkin sesuatu yang tampak polos seperti INSERT
yang mengeksekusi tanpa pertama-tama mengeluarkan SET NOCOUNT ON
.