Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ожидание новых данных в таблице, как можно организовать ожидание события? 
V
    Опции темы
azesmcar
Дата 26.5.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Добрый день,

В программе нужно получать данные из одной таблицы в базе данных, чтобы не делать этого периодически (таймером) хотелось бы подписаться на событие insert на конкретной таблице. Насколько я помню такая возможность в oracle есть, как это называется и как это делается? Я предполагаю что делается запрос wait, который зависает до того момента, пока какая нибудь другая сессия не произвела модификацию на нужной нам таблице.

Добавлено через 12 минут и 37 секунд
нашел пакет dbms_alert, кажется вопрос решен.
PM   Вверх
ToshaCh
Дата 26.5.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: 12
Всего: 26



Хм. Мне кажется или речь идёт про триггеры?


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
azesmcar
Дата 26.5.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



нет, точнее триггеры тут конечно нужны, но самим механизмом является не триггер а dbms_alert. Из триггера дается сигнал (dbms_alert.signal), из программы ожидается (dbms_alert.waittone). Кажется так, пока только теория, проверить не успел.
PM   Вверх
Zloxa
Дата 26.5.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



azesmcar, следует помнить что алерт - разделяемый ресурс, со всеми вытекающими -  сигнялящие сессии выстраиваются в очередь на коммите.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 26.5.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  26.5.2010,  16:17 Найти цитируемый пост)
пока только теория

если интересно, в примере ровно твой случай
PM MAIL ICQ   Вверх
Zloxa
Дата 26.5.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



блин не смог воспроизвести :(((((
неужели я гоню? Или с 10ки чтото изменили?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 26.5.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(Zloxa @  26.5.2010,  16:20 Найти цитируемый пост)
azesmcar, следует помнить что алерт - разделяемый ресурс, со всеми вытекающими -  сигнялящие сессии выстраиваются в очередь на коммите. 

commit происходит сразу же после insert-а, одна сессия добавляет - другая читает, вставляется всегда одна строка. Вроде проблем быть не должно.

Цитата(DimW @  26.5.2010,  16:25 Найти цитируемый пост)
если интересно, в примере ровно твой случай 

спасибо smile

Цитата(Zloxa @  26.5.2010,  16:29 Найти цитируемый пост)
блин не смог воспроизвести :(((((
неужели я гоню? Или с 10ки чтото изменили? 

Да нет вроде
Цитата

Alerts are transaction-based. This means that the waiting session is not alerted until the transaction signalling the alert commits. There can be any number of concurrent signalers of a given alert, and there can be any number of concurrent waiters on a given alert.

http://download.oracle.com/docs/cd/B19306_...258/d_alert.htm
ты ведь это имел ввиду?

Это сообщение отредактировал(а) azesmcar - 26.5.2010, 16:35
PM   Вверх
Zloxa
Дата 26.5.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(azesmcar @  26.5.2010,  16:32 Найти цитируемый пост)
There can be any number of concurrent signalers of a given alert

по всему выходит я въе#ался ошибси.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 26.5.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



В общем проверил, прочитал..dbms_alert по всем параметрам то что нужно smile 

Всем спасибо.
PM   Вверх
ToshaCh
Дата 28.5.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: 12
Всего: 26



Погуглил тему. Возникает вопрос если получатель сигнала один, dbms_pipe не будет ли производительнее?

Это сообщение отредактировал(а) ToshaCh - 28.5.2010, 17:39


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
Zloxa
Дата 28.5.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(ToshaCh @  28.5.2010,  14:32 Найти цитируемый пост)
dbms_pipe не будет ли производительнее?

У них разное назначение, потому и сравнивать в общем случае так же корректно как distinct и group by. Т.е. в частном случае одно можно заменить другим, а в общем - нет.

Если мы откатим транзакцию то алерт не поднимится, а крик в трубу будет услышан.
Если мы несколько раз поднимим один алерт, мы считать можем только один, а крики в трубу мы услышим каждый. Т.е. если это будет row триггер, то прочитаем мы из трубы не менее раз чем было изменено строк.

Добавлено @ 15:21
Цитата(Zloxa @  26.5.2010,  16:20 Найти цитируемый пост)
azesmcar, следует помнить что алерт - разделяемый ресурс, со всеми вытекающими 


удалось таки воспроизвести:
Сессия1:
Код

SQL> exec   dbms_alert.register('hello');
 
PL/SQL procedure successfully completed
 

Сессия2:
Код

SQL> exec   dbms_alert.signal('hello','world');
 
PL/SQL procedure successfully completed
 

Сессия3:
Код

SQL> exec dbms_alert.signal('hello','world twiсe');
.
.
.

Сессия3 висит на блокировке до коммита 2й
Т.е. вешая алерт в триггере ты как бы делаешь возможность модификации таблицы лишь в режиме монопольного доступа

В прошлый раз воспросизвести не смог потому что слушателя не регал.
Хоть эта хрень работает и немного не так как раньше упоминал, таки я не совсем балабол окзаался  smile 


Это сообщение отредактировал(а) Zloxa - 28.5.2010, 15:26


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 28.5.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(ToshaCh @  28.5.2010,  14:32 Найти цитируемый пост)
 если получатель сигнала один, dbms_pipe не будет ли производительнее?

в контексте вышеописанной байды вопрос таки уместен


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 31.5.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(Zloxa @  28.5.2010,  15:09 Найти цитируемый пост)

Сессия3 висит на блокировке до коммита 2й
Т.е. вешая алерт в триггере ты как бы делаешь возможность модификации таблицы лишь в режиме монопольного доступа

 smile это меня устраивает.

Цитата(Zloxa @  28.5.2010,  15:34 Найти цитируемый пост)
в контексте вышеописанной байды вопрос таки уместен 

ну откровенно говоря на данный момент производительность устраивает, не вижу причин что-то менять, работает - и прекрасно. К тому же alert имеет одну интересную особенность, если отправить сигнал, в то время как его никто не ожидает и все слушатели покорно занимаются своим личным делом заткнув уши, то при следующем waitone слушатель получит сигнал, и я даже подозреваю, что можно увеличить pool каким-то образом, хотя это только подозрения, уличить его мне пока не удалось smile

PM   Вверх
Zloxa
Дата 31.5.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(azesmcar @  31.5.2010,  08:52 Найти цитируемый пост)
 это меня устраивает.

А я не говорю что так делать нельзя, я говорю, что это надо иметь в виду.

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

Добавлено через 4 минуты и 22 секунды
К чему я это говорю?
елси бы я не сбил писюлю и не выставил проверку, но использовал алерты, мои чудные "эксперты по интеграции" в своих проблемах с производительностью обвинили бы меня, и моей конторе пришлось бы оплачивать их усилия по устранению своих ошибок проектирования.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 31.5.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(Zloxa @  31.5.2010,  09:13 Найти цитируемый пост)
А я не говорю что так делать нельзя, я говорю, что это надо иметь в виду.

Я имел ввиду что я это учел и это меня устраивает smile
Транзакций тут как таковых нет, в общем задача такая
Есть довольно хреновая программа, использующая довольно хреновую архитектуру, работает она настолько плохо, что ее решили переписать, и сделать это было решено "умными дядькями" в характерной им форме. Переписывать помодульно, забыв о том, что сама архитектура является плодом больного воображения. В общем две разных программы общаются через базу данных, а именно некоторую таблицу. Нынешняя программа таймером (каждые две секунды) посылает запрос базе и читает оттуда smile я улучшаю ее как могу. Никаких транзакций там нету, за инсертом сразу же следует commit, потому проблем не вижу. Такие дела...

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.