Книга по программированию.


Асинхронные события в СУБД

Для начала прочитайте статью про события в СУБД
Данная статься является продолжением-дополнением к статье про обычные события.

Для чего они вообще нужны, асинхронные события?
Иногда какая либо логика может быть очень весомой и отнимать немалые ресурсы и обрабатывать ее синхронно невыгодно, можно повесить сервер или заблокировать таблицу. Вот в таком случае выгодно вынести обработку в отдельный поток, который может даже обрабатывать такие события в часы и минуты простоя. То есть вы провели документы по складу, но при этом накладная на выдачу сформировалась не сразу, а легла в очередь, через 1-2 минуты она появится у кладовщика.

Для реализации асинхронного события нужно создать таблицу для хранения очереди возникших событий и асинхронный обработчик, который будет работать в отдельном потоке, для чего подойдет JOB.

Создадим таблицу

create table Queue
(
  ID        int identity(1, 1),
  EventOID  int,
  RaiseTime datetime,
  StartTime datetime,
  SenderOID int,
  Error     bit,
  ErrorMsg  varchar(1024),
  TryCount  int default 0,
  primary key (ID )
)
go

create index IX_Total on Queue ( StartTime, RaiseTime, EventOID )
go


EventOID - идентификатор события
RaiseTime - время добавления события в очередь
StartTime - время возникновения (возбуждения) события. То есть событие попало в очередь сегодня, а обработаться должно будет через 2 дня.
SenderOID - идентификатор объекта, бросившего событие
Следующие три поля нужны в случае возникновения ошибки при обработке

Теперь нужно написать хранимую процедуру, которая возбуждает событие

create procedure Event_OnCreate_ThrowAsync
  @SenderOID int -- идентификатор объекта, который бросает событие
  @StartTime datetime = getdate()
as
  declare @EventOID int
  select @EventOID = OID from VEvent where Name = 'Create'
  insert into Queue ( EventOID, RaiseTime, StartTime )
    values ( @EventOID, getdate(), @StartTime )
go


И еще нужна хранимая процедура для обработки асинхронных событий

create procedure HandleEventsAsync
as
  declare @EventOID  int,
          @TryCount  int,
          @SenderOID int,
          @ID        int

  select top 1 
         @EventOID = EventOID, 
         @TryCount = TryCount, 
         @SenderOID = SenderOID, 
         @ID = ID
    from Events
    where StartTime <= getdate()
    and (Error = 0 or TryCount <=3)
    order by RaiseTime

  declare Cur cursor fast_forward for
    select h.ProcName
      from TEvent_Handlers h
      where h.OID = @EventOID
        and h.Async = 1

  open Cur
    fetch next from Cur into @ProcName
    while @@fetch_status = 0
    begin
      begin try
        exec @ProcName @SenderOID
        delete Queue where ID = @ID
      end try
      begin catch
        set @ErrorMsg = 'Ошибка при обработке события, процедура: "' + isnull(@ProcName, 'процедура не найдена') + '" (ERROR_PROCEDURE '
                + isnull(ERROR_PROCEDURE(), '') + ', Line ' + isnull(cast(ERROR_LINE() as varchar), '')  
                + '), ' + isnull(ERROR_MESSAGE(), '')

        if @TryCount < 3
          update Queue
            set TryCount = @TryCount + 1,
         Error = 1
            where ID = @ID
        else
          update Queue
            set Error = 1,
                ErrorMsg = @ErrorMsg
            where ID = @ID
      end catch  
      fetch next from Cur into @ProcName
    end
  close Cur
  deallocate Cur
go


Ну и собственно нужно написать скрипт для JOB'а

while 1 = 1
begin
  exec HandleEventsAsync
  wait for delay '00:00:00.001'
end


Всё, наслаждайтесь асинхронной обработкой событий.
добавлено: 20 янв 16 просмотры: 1232, комментарии: 1



События в реляционных СУБД

Как сделать события в базе данных

Для этого нужны события и обработчики событий
Создадим класс Событие (Event), наследник от Object

1. Добавим записи в таблицы ClassTree и ClassTreePath (см. предыдущую статью)
2. Создадим таблицу для класса Event

create table TEvent
(
  OID int primary key clustered
)
go


читать дальше...
добавлено: 07 дек 15 просмотры: 1831, комментарии: 7



ООП в реляционных СУБД

ООП - объектно-ориентированное программирование прочно вошло в нашу жизнь, я имею ввиду жизнь программистов.
В любой области и любом языке (почти) есть объекты, классы, наследование, полиморфизм и т.д. Без этого невозможно
представить себе какую-либо систему даже средней сложности
Но есть целая область в программировании так толком и не охваченная ООП. И эта область - базы данных. До сих по
основную нишу занимают реляционные СУБД. Все попытки создать полноценную ООСУБД так и не увенчались успехом
Зато появилось много систем маппинга объектов на таблицы: Hibernate, LINQ, BOLD и множество менее известных
Системы маппинга дают прекрасную возможность работать с данными как с объектами, только есть одно НО, эти данные
обрабатываются на стороне клиента (по отношению к СУБД). А из этого вытекают следующие проблемы:
читать дальше...
добавлено: 04 дек 15 просмотры: 1915, комментарии: 19



Школа программирования

Этой серией статей я решил начать писать книгу о программировании.

В наше время много книг о программировании, но я не хочу написать ЕЩЕ ОДНУ. Нет, я хочу написать практическое руководство, о том как писать конкретно конкретные программы. Иначе получится еще одна книга, которая в общих чертах рассказывает о программировании вообще и некоторых принципах в частности.

Чтобы было более понятно, приведу пример. Есть поваренные книги. В них написано как приготовить то или иное блюдо. Это конкретика. Описано какие надо взять продукты, какие пропорции, в какой последовательности их брать и смешивать, какие именно процедуры надо выполнить по шагам, чтобы получить готовое съедобное блюдо.

А теперь представьте себе, вы держите в руках поваренную книгу в которой описаны просто базовые принципы приготовления. Например, как нужно солить. Солить надо так, чтобы на вкус было не пересолено и не пресно. Муку лучше брать хорошего качества. Воду подогревать. Масло тоже не помешает. Тесто надо хорошо вымесить. Как вымесить знает только профессионал, поэтому вам потребуется несколько лет для приобретения опыта, в результате чего вы станете гуру хлебопечения. Температура должна быть не слишком высокой, чтобы хлеб не подгорел и не слишком низкой, чтобы хлеб не был сырым. И так далее и тому подобное.

Прочитав такое описание вы сможете испечь хлеб? Я думаю, вряд ли. Так вот, моей целью как раз и является дать конкретные рецепты для конкретных программ. После прочтения каждой статьи из этой серии вы сможете сесть и написать абсолютно рабочую программу.
добавлено: 04 дек 15 просмотры: 1661, комментарии: 5