Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2
  • 3

ТЕМА:

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2380

Единственная проблема которая может в данном случае возникнуть при использовании DBMS_PIPE/DBMS_ALERT - это то, что данный механизм межпроцессных коммуникации нетранзакционный. Т.е. срабатывать из триггера и оповещать клиента он будет после insert-a записей независимо от того зафиксирована была транзакция или была откатана.
+ клиент может полезть в базу за обновлениями до того как они будут зафиксированы.
таким образом делать оповещение через DBMS_PIPE/DBMS_ALERT надо не из триггера post-insert а из программы которая добавляет запись, причём непосредственно после commit.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2381

Ты не прав(точнее не совсем прав). DBMS_ALERT посылает сообщение только после коммита, это ее одно из отличий от DBMS_PIPE. Поэтому я и сказал что в данном случае надо ее использовать.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2382

Точно "Alerts are asynchronous and transaction-based". Я почему-то думал что у них с pipe-ми одна природа.
Тогда вообще нет ни каких проблем.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2383

dior, скинь пожалуйста фрагмент кода (небольшой ) как примерно ты это делаешь...
через DBMS_ALERT разумеется!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2384

create or replace trigger mytrigger
after insert or update or delete on mytable
begin
DBMS_ALERT.SIGNAL('myevent','Пора обновиться');
end;

Обработка зависит от того, что ты используешь. Я использую DOA, примерно так же будет и при использование ODAC.
procedure TfrmMain.OracleEventEvent(Sender: TOracleEvent;
const ObjectName: String; const Info: Variant);
begin
// обновление данных;
end;

OracleEvent.ObjectNames='myevent';
OracleEvent.ObjectType:=otAlert;
OracleEvent.OnEvent:=TfrmMain.OracleEventEvent;
OracleEvent.Start;
Извини, но больше нечего писать, поэтому и не приводил ни каких примеров. Слишком все просто.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Автоматическая передача программе новых записей 12 года 9 мес. назад #2385

Я пробовал использовать DBMS_ALERT (поскольку он транзаксозависимый), но там такая неудобная штука:
когда происходит изменение он посылает сигнал всем сессиям которые его в ДАННЫЙ МОМЕНТ СЛУШАЮТ. Если процесс прослушки не запущен, то данное изменение для этой сессии считается потерянным. Т.е. чтобы с DBMS_ALERT работало надо чтобы на клиенте ПОСТОЯННО болтался прослушивающий процесс. По идее надо создать пул этих процессов работающих параллельно и пока одни процессы обрабатывают поступившее сообщение другие ожидают следующих. Мне все это показалось достаточно громоздким (может я неправ, хотя сроки поджимали) и поэтому был реализован вариант триггера с временной таблицей. клиент периодически ее опрашивает.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
Время создания страницы: 0.266 секунд