Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Всеки недостатък на използването на ExecuteReaderAsync от C# AsyncCTP

Не съм съгласен с Ricka по този въпрос. Async DB командите са не само добри, те са критични за постигане на мащаб, пропускателна способност и латентност. Възражението му относно времето за нарастване на пула от нишки се отнася само за уеб сървър, който изпитва нисък обем трафик.

В ситуация с голям трафик (което е единственото, което има значение), пулът от нишки няма да трябва да чака за „инжектиране“ на нови нишки. Изпълнението на SQL командите асинхронно е важно не само от гледна точка на заявките/нишките на уеб сървъра, но и от гледна точка на общия живот/закъснение на заявката:некорелираните DB извиквания могат да се извършват паралелно, за разлика от последователно. Само това обикновено води до драматични подобрения в латентността на HTTP заявката, както се усеща от потребителя. С други думи, вашите страници се зареждат по-бързо.

Един съвет обаче:SQL командата не е наистина асинхронна, докато не активирате Asynchronous Processing=true на низа за свързване. Въпреки че това не е зададено (и по подразбиране не е, Редактиране:започвайки с .NET Framework <4.5. Asynchronous Processing вече не се изисква ) вашите „асинхронни“ извиквания към BeginExecuteReader не са нищо друго освен измама, обаждането ще стартира нишка и ще блокира това резба. Когато истинската асинхронна обработка е активирана в низа за връзка тогава повикването е наистина асинхронно и обратното извикване се основава на завършване на IO.

Внимание:асинхронна SQL команда завършва веднага след първата резултатът се връща на клиента и информационните съобщения се броят за резултат.

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

Загубихте всички предимства на async. print създава резултат, който се изпраща обратно на клиента, който завършва async командата и изпълнението на клиента се възобновява и продължава с 'reader.Read()'. Сега това ще блокира, докато сложната заявка започне да дава резултати. Питате „кой поставя print в процедурата?' но print може да е маскиран в нещо друго, може би нещо толкова невинно изглеждащо като INSERT който се изпълнява без първо издаване на SET NOCOUNT ON .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GROUP BY за комбиниране/свързване на колона

  2. Как да наблюдавате промените в таблицата на SQL Server с помощта на C#?

  3. @@DATEFIRST – Вземете първия ден от седмицата в SQL Server

  4. Как ефективно моделирате наследяването в база данни?

  5. Задаване на DefaultDataPath и DefaultLogPath при внедряване в проекта за база данни VS2010