Как можно видеть, пример не слишком сложный. Из
ключевых особенностей можно отметить
Asynchronous Processing = true
|
в строке подключения. Эта строка обеспечивает работу с
базой данных в асинхронном режиме. Еще один момент - WAITFOR DELAY в запросе, для имитации длительности его выполнения, дальнейшее должно быть очевидно из
комментариев.
Несколько слов о некоторых особенностях данного
механизма:
Как уже было замечено ранее, для использования
асинхронного режима в строке подключения надо указать Asynchronous Processing =
true (или просто async = true), но, как уже было замечено выше, пользоваться
этой возможностью надо без фанатизма.
Каждому вызову Begin* обязательно должен
соответствовать вызов метода End*, небрежность может привести к утечке
ресурсов.
Если на сервер будет передан ошибочный запрос, который
распознается как ошибочный до начала выполнения, то исключение будет выброшено
методом Begin*, в противном случае, запрос считается выполненным, и исключение
выбрасывается при вызове метода End*. К этому надо быть готовым.
В текущей бета-версии метод SqlCommand.Cancel() в
асинхронном режиме не поддерживается, и неизвестно, будет ли поддерживаться в
релизе.
Извещение об изменениях в результатах запроса (Query
Notification)
Довольно часто возникает желание уведомить клиентское
приложение о том, что в базе произошли некие изменения. На самом деле такое
желание возникает гораздо чаще, чем встречается реальная необходимость в
подобной функциональности. Но, тем не менее, бывают случаи, когда это
действительно нужно. Поэтому в MS SQL Server 2005 и ADO.Net 2.0 была
реализована поддержка подобного сценария.
Со стороны SQL Server в этом предприятии участвуют
собственно ядро сервера (Sql Engine), Service Broker и специальная хранимая
процедура sp_DispatcherProc. Со стороны ADO.Net участвуют классы SqlNotificationRequest
и SqlDependency из пространства имен System.Data.SqlClient. Кеш ASP.Net также
поддерживает эту функциональность. Для этого используется класс
System.Web.Caching.Cache.
В общем виде сценарий использования уведомлений об
изменении запрошенных данных выглядит примерно так:
У объекта SqlCommand, который содержит запрос, в
процессе его инициализации заполняется свойство Notification, которое содержит
подписку на оповещение об изменениях запрошенного набора данных (это свойство
(Notification) передается на сервер вместе с запросом).
После получения пакета с таким свойством сервер
регистрирует подписку на изменения и выполняет пришедший запрос в обычном
порядке, отсылая результат клиенту.
Ядро сервера следит за всеми DML-операциями, которые
могут привести к изменению результата запроса, и если сервер подозревает, что
результат был изменен, ServiceBroker-у посылается специальное сообщение об
этом.
Далее, в зависимости от применяемого сценария, сообщение может быть сразу отправлено клиентскому приложению или же помещено в
очередь, чтобы клиентское приложение забрало его само.