Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Tack
Member

Откуда:
Сообщений: 44
Надо посылать клиентам с сервера уведомления при выполнении определенных процедур (при ручном вызове или по джобу).
1) Можно написать расширенную хранимую C++ процедуру, которая будет слать сообщения клиентам по TCP-IP/UDP, Mailslot или любому другому протоколу IPC.
2) Можно создать in-proc COM-сервер, который будет делать те же действия.

Какой способ лучше в плане скорости? Что чаще используется для сигнализации? Какие есть альтернативы этим методам?
8 июл 05, 12:10    [1687454]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Berg
Member

Откуда: Кр-ск
Сообщений: 3480
Сервис событий в SQL-сервере
8 июл 05, 12:44    [1687647]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Red_dz
Member

Откуда: Нижний Новгород
Сообщений: 41
А стандартные методы не подходят?
sp_addmessage
sp_add_operator
RAISERROR

BOL, Responding to Events
8 июл 05, 12:50    [1687676]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
aleks2
Guest
Tack
Надо посылать клиентам с сервера уведомления при выполнении определенных процедур (при ручном вызове или по джобу).
1) Можно написать расширенную хранимую C++ процедуру, которая будет слать сообщения клиентам по TCP-IP/UDP, Mailslot или любому другому протоколу IPC.
2) Можно создать in-proc COM-сервер, который будет делать те же действия.

Какой способ лучше в плане скорости? Что чаще используется для сигнализации? Какие есть альтернативы этим методам?


Самые что ни есть тривиальные: обычное подключение клиента к серверу и ожидание события на коннекте (см. sp_getapplock).
------------------
Дешево и сердито...
8 июл 05, 13:06    [1687784]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Tack
Member

Откуда:
Сообщений: 44
Berg
Сервис событий в SQL-сервере


Спасибо за ссылку!
8 июл 05, 13:31    [1687927]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
fte
Member

Откуда: Moscow
Сообщений: 394
{ **** UBPFD *********** by delphibase.spb.ru ****
>> Обратная связь от MSSQL-сервера к клиенту

На форуме постоянно возникает вопрос - "Как получить обновление данных, по событию, а не таймером", 
чтобы снять его раз и навсегда привожу код dll-ки, 
которая является Extended Stored Procedure с единственной функцией - отправкой UDP-broadcast сообщения.

Зависимости: Windows, SysUtils, IdUDPClient
Автор:       Delirium, VideoDVD@hotmail.com, ICQ:118395746, Москва
Copyright:   Delirium (Master BRAIN) 2003
Дата:        24 октября 2003 г.
************************************************ }

library Messager;

uses
  Windows,
  SysUtils,
  IdUDPClient;

function srv_rpcparams(srvproc:Pointer):integer; cdecl; external 'opends60.dll' name 'srv_rpcparams';
function srv_paramdata(srvproc:Pointer; n:integer):integer; cdecl; external 'opends60.dll' name 'srv_paramdata';
function srv_paramlen(srvproc:Pointer; n:integer):integer; cdecl; external 'opends60.dll' name 'srv_paramlen';

procedure SendUDPMessage(Params:Pointer); stdcall; cdecl; export;
var id:TIdUDPClient;
    Msg:String;
    Host,Port:String;
begin
try
if srv_rpcparams(Params)<2 then exit;
Host:=Copy(PChar(srv_paramdata(Params,1)), 1, srv_paramlen(Params,1));
Port:=Copy(Host,Pos(':',Host)+1,Length(Host));
Delete(Host,Pos(':',Host),Length(Host));
Msg:=Copy(PChar(srv_paramdata(Params,2)), 1, srv_paramlen(Params,2));
id:=TIdUDPClient.Create(nil);
id.BroadcastEnabled:=True;
id.Host:=Host;
id.Port:=StrToInt(Port);
id.ReceiveTimeout:=-1;
id.Send(Msg);
id.Free;
except end;
end;

exports SendUDPMessage;

begin
end.

  Пример использования:
Для регистрации на MSSQL скопировать dll в 
c:\Program Files\Microsoft SQL Server\80\Tools\Binn
и исполнить скрипт 
sp_addextendedproc 'SendUDPMessage', 'Messager.dll'

На клиенте рекомендую использовать компонент TIdUDPServer.

Передача сообщений осуществляется так
exec SendUDPMessage '255.255.255.255:8080', 'Привет!'
где 255.255.255.255 - broadcast маска, но можно написать и конкретный адрес (192.168.1.10), 8080 - выбранный для использования порт.
8 июл 05, 16:50    [1689344]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
aleks2
Guest
fte
На форуме постоянно возникает вопрос - "Как получить обновление данных, по событию, а не таймером", 
чтобы снять его раз и навсегда привожу код dll-ки, 


А ведь если хорошо подумать: гм... а кто сказал, что таймер - это "наше все"?
--------------
Просто отсутствие воображения мешает...
Все это решаемо средствами стандартного ADO-подключения. И нет нужды городить огород с ESP.
9 июл 05, 07:51    [1690383]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Tack
Member

Откуда:
Сообщений: 44
Мы тут сравниваем разные варианты сигнализации.

Насчет способа, описанного в этой статье (сигнализация задержкой вызова ХП):
https://www.sql.ru/articles/mssql/02040201AlertServiceForSQLserv.shtml

Скажите, насколько падает производительность, если послать широковещательное сообщение, т.е. одновременно засигналить 40-50 объектов Event и "провернуть" соответствующее кол-во ХП?

У коллектива сейчас идет выбор между этим методом и UDP. Соотношение широковещательных и адресных посылок в разрабатываемой ИС - 50/50.
11 июл 05, 09:20    [1691645]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Tack

Скажите, насколько падает производительность, если послать широковещательное сообщение, т.е. одновременно засигналить 40-50 объектов Event и "провернуть" соответствующее кол-во ХП?


у нас реализовано в виде ESP, которая запускает процесс в начале и позволяет оповещать зарегистрированых клиентов (организована подписка-отписка). Их с десяток, но обьемы данных настолько при этом настолько смехотворны, что о производительности нет смысла даже говорить.
11 июл 05, 17:40    [1694098]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
avec
Member

Откуда: Москва
Сообщений: 826
fte
{ **** UBPFD *********** by delphibase.spb.ru ****
>> Обратная связь от MSSQL-сервера к клиенту

На форуме постоянно возникает вопрос - "Как получить обновление данных, по событию, а не таймером", 
чтобы снять его раз и навсегда привожу код dll-ки, 
которая является Extended Stored Procedure с единственной функцией - отправкой UDP-broadcast сообщения.

Зависимости: Windows, SysUtils, IdUDPClient
Автор:       Delirium, VideoDVD@hotmail.com, ICQ:118395746, Москва
Copyright:   Delirium (Master BRAIN) 2003
Дата:        24 октября 2003 г.
************************************************ }

library Messager;

uses
  Windows,
  SysUtils,
  IdUDPClient;

function srv_rpcparams(srvproc:Pointer):integer; cdecl; external 'opends60.dll' name 'srv_rpcparams';
function srv_paramdata(srvproc:Pointer; n:integer):integer; cdecl; external 'opends60.dll' name 'srv_paramdata';
function srv_paramlen(srvproc:Pointer; n:integer):integer; cdecl; external 'opends60.dll' name 'srv_paramlen';

procedure SendUDPMessage(Params:Pointer); stdcall; cdecl; export;
var id:TIdUDPClient;
    Msg:String;
    Host,Port:String;
begin
try
if srv_rpcparams(Params)<2 then exit;
Host:=Copy(PChar(srv_paramdata(Params,1)), 1, srv_paramlen(Params,1));
Port:=Copy(Host,Pos(':',Host)+1,Length(Host));
Delete(Host,Pos(':',Host),Length(Host));
Msg:=Copy(PChar(srv_paramdata(Params,2)), 1, srv_paramlen(Params,2));
id:=TIdUDPClient.Create(nil);
id.BroadcastEnabled:=True;
id.Host:=Host;
id.Port:=StrToInt(Port);
id.ReceiveTimeout:=-1;
id.Send(Msg);
id.Free;
except end;
end;

exports SendUDPMessage;

begin
end.

  Пример использования:
Для регистрации на MSSQL скопировать dll в 
c:\Program Files\Microsoft SQL Server\80\Tools\Binn
и исполнить скрипт 
sp_addextendedproc 'SendUDPMessage', 'Messager.dll'

На клиенте рекомендую использовать компонент TIdUDPServer.

Передача сообщений осуществляется так
exec SendUDPMessage '255.255.255.255:8080', 'Привет!'
где 255.255.255.255 - broadcast маска, но можно написать и конкретный адрес (192.168.1.10), 8080 - выбранный для использования порт.


Подскажите как ее скомпилить под 64 bit для устновки на MS SQL 2008?
3 авг 10, 16:30    [9201587]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Delphi 2010 возможно умеет или FreePascal
3 авг 10, 21:47    [9203623]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
avec
Подскажите как ее скомпилить под 64 bit для устновки на MS SQL 2008?
А может не надо? Представьте: каждое клиентское приложение должно само быть сервером UDP. Вдруг конфликт с каким-нибудь другим сервером, например, с Apache или фиг знает каким еще (мало ли кто там бродкастами кидается в сетке?;)). Да еще объясняйся потом с админом за бродкасты. Может все-таки помучаться и разобраться с Service Broker?
3 авг 10, 22:04    [9203663]     Ответить | Цитировать Сообщить модератору
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Berg
Сервис событий в SQL-сервере

Знаю, что статья старая, но всё же я бы поостерёгся запускать чужой сервис на своём сервере без предварительного анализа исходников.
Их в статье нет, есть только скомпилированная библиотека.
4 авг 10, 09:22    [9204764]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сигнализация клиентам. Использовать расширенные ХП или COM-объект?  [new]
АлексейПрохожий
Guest
Я по поводу приведённой выше процедуры SendUDPMessage. Пока работал на 32 битном SQL всё было хорошо. Поставили 64 битный возникла проблема. Процедура не работает.
Если из неё удалить функции srv_rpcparams, srv_paramdata, srv_paramlen и написать напрямую номер порта, хост и текст сообщения, то всё доходит. Пробовал на MS Server 2008 Standart (64 bit), Windows 7 (64 bit) с Developer версией везде одно и тоже. Может кто нибудь доскажет, что делать. Компилировал на Delphi XE2 для 64 битной платформы.
Мой адрес ocean2000@hotbox.ru.
Алексей.
12 ноя 11, 17:09    [11587093]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить