Прочитал руководство Microsoft по проектированию архитектуры приложений.
Как по мне, так получился неплохой хорошо структурированный справочник.
К примеру, проектируем слой представления, смотрим, ага здесь уместно будет использовать шаблоны MVC и Command. Так нужно бы поподробнее, кликаем по ссылке и попадаем на страницу MSDN, где эти шаблоны описаны и.т.д.
Собственно, руководство можно скачать здесь
P.S. Эх мечты, мечты ...
воскресенье, 28 марта 2010 г.
суббота, 13 марта 2010 г.
суббота, 6 марта 2010 г.
Пример применения WAITFOR DELAY
Такой вот небольшой примерчик. Допустим мы знаем, что некое действие на сервере (к примеру заполнение некой таблицы) закончиться примерно к 7.00, но точное время будет постоянно меняться. После того как таблица заполнится, нам необходимо выполнить какое-нибудь действие (к примеру сформировать отчеты и разослать их пользователям по почте).
Как это можно сделать? Я вижу несколько вариантов:
1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.
2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать.
3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно).
Ну и в виде кода все это дело может выглядить примерно так:
Как это можно сделать? Я вижу несколько вариантов:
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