воскресенье, 28 марта 2010 г.

Руководство Microsoft по проектированию архитектуры приложений

Прочитал руководство Microsoft по проектированию архитектуры приложений.
Как по мне, так получился неплохой хорошо структурированный справочник.
К примеру, проектируем слой представления, смотрим, ага здесь уместно будет использовать шаблоны MVC и Command. Так нужно бы поподробнее, кликаем по ссылке и попадаем на страницу MSDN, где эти шаблоны описаны и.т.д.

Собственно, руководство можно скачать здесь

P.S. Эх мечты, мечты ...

суббота, 6 марта 2010 г.

Пример применения WAITFOR DELAY

Такой вот небольшой примерчик. Допустим мы знаем, что некое действие на сервере (к примеру заполнение некой таблицы) закончиться примерно к 7.00, но точное время будет постоянно меняться. После того как таблица заполнится, нам необходимо выполнить какое-нибудь действие (к примеру сформировать отчеты и разослать их пользователям по почте).

Как это можно сделать? Я вижу несколько вариантов:

1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.
2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать.
3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно).

Ну и в виде кода все это дело может выглядить примерно так:

USE [Temp]  
GO
IF  EXISTS (SELECT 
    1 
   FROM sys.objects 
   WHERE object_id = OBJECT_ID(N'[dbo].[tbLog]') 
    AND type in (N'U')
   )
BEGIN
 DROP TABLE [dbo].[tbLog]
END

CREATE TABLE [dbo].[tbLog](
[Date] [datetime] NULL
) ON [PRIMARY]
-- ------------------------------------------------------------
IF EXISTS ( SELECT 
    1 
   FROM sys.objects 
   WHERE object_id = OBJECT_ID(N'[dbo].[spTestDelay]') 
    AND type in (N'P', N'PC')
   )
BEGIN
 DROP PROCEDURE [dbo].[spTestDelay]
END
GO
CREATE PROCEDURE [dbo].[spTestDelay]
AS
BEGIN
 DECLARE @Flag bit
 SET @Flag = 0

 WHILE @Flag = 0
 BEGIN
  -- waiting for updates
  IF EXISTS( SELECT 
      1 
     FROM [dbo].[tbLog] 
     WHERE  DATEDIFF(DAY, Date, GETDATE()) = 0
     )
  BEGIN
   -- Run necessary stored procedures
   SET @Flag = 1
  END
  ELSE
  BEGIN
   WAITFOR DELAY '00:01'
  END
 END
END