Russian Qt Forum
Сентябрь 30, 2024, 18:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не доходят NOTIFY от базы PostgreSQL на линуксе  (Прочитано 11275 раз)
MetalKrot
Гость
« : Сентябрь 21, 2012, 15:22 »

Доброго времени суток.

У меня такая проблема. Есть приложение, которое взаимодействует с базой данных. База должна отправлять NOTIFY всем своим подписчикам (несколько запущенных программ). База не отправляет сообщение тому приложению, чьи действия повлекли возникновение сообщения. Тоесть если приложение изменило данные, то оно не получает сигнал, а все остальные приложения получают. Почему?

Код программы выкладываю. Это самый простой пример. Программа сама создаёт таблицу и тригер.

Использую:
OpenSUSE 12.1
PostgreSQL 8.4
Qt 4.8

На Windows всё работает отлично.
« Последнее редактирование: Сентябрь 22, 2012, 11:10 от MetalKrot » Записан
MetalKrot
Гость
« Ответ #1 : Сентябрь 21, 2012, 15:53 »

Ещё одно наблюдение. Такое чувство, что сигналы становятся в очередь и не обрабатываются. Их обработка происходит если другое приложение внесло изменения в базу. И обрабатываются они все сразу. Вот лог программы.

Код:
CREATE TABLE true 
CREATE TRIGGER true
subscribeToNotification true
connect true
INSERT true
INSERT true
test
test
test

Здесь видно, что данное приложение два раза посылало запрос INSERT, а в итоге пришло три сигнала. Пришли они после того, как в другом приложении был выполнен аналогичный запрос INSERT.
Записан
fte
Гость
« Ответ #2 : Сентябрь 21, 2012, 16:29 »

Код:
BEGIN
       LISTEN classif_n;  -- Зачем триггер подписываете на получение сообщений?
       NOTIFY classif_n;
       RETURN NULL; -- в таблицу ничего не добавилось, так и надо ?
END;
Записан
MetalKrot
Гость
« Ответ #3 : Сентябрь 22, 2012, 11:09 »

Насчет подписания тригера. Я точно не знаю, знающий человек сказал что в документации так описано. Впринципе без этого тоже работает корректно, скорее всего нужно убрать эту строчку.

Насчет возвращаемого значения. В таблицу добавилось, тригер срабатывает после внесения изменений в таблицу.

Вопрос не в этом. Данная программа является минимальным примером.
Записан
MetalKrot
Гость
« Ответ #4 : Сентябрь 26, 2012, 09:28 »

Я не могу поверить, что никто не сталкивался с данной проблемой. Была же тема уже такая. Только там так и не разобрались с данной проблемой.
Линуксоиды! Помогите!
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 26, 2012, 09:35 »

Нужно призывать страшных линуксоидов и использовать дебаггер Улыбающийся

PS я виндузятник Улыбающийся
Записан
MetalKrot
Гость
« Ответ #6 : Сентябрь 26, 2012, 09:41 »

А что дебагить? Драйвера? Дебагил, работают правильно. Свой код? Дебагил, работает правильно. Куда дальше лезть? Единственный вариант остался QSocetNotify (если не ошибся с названием). Он обрабатывает сигналы. Если же и в нем будет всё нормально, тогда остаётся только база. Значит нужно искать исходники базы и колупать их, чего мне делать очень не хочется...
Записан
Bepec
Гость
« Ответ #7 : Сентябрь 26, 2012, 09:53 »

Дебажить надо свой код и код Qt. Да - да, тот класс который обрабатывает получаемые сообщения.

PS хотя логика есть в таком поведении. Это же linux. Программа изменила данные. Значит программа знает что делает. А если незнает, то плохая программа. (меняем программу на пользователь и получаем философию linux)

PPS а зафига вам, извиняюсь, сообщение об изменении программе, которая их вносит?

PPPS Мб это логика БД в linux?

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Сентябрь 26, 2012, 09:56 »

Дебажить надо свой код и код Qt. Да - да, тот класс который обрабатывает получаемые сообщения.

PS хотя логика есть в таком поведении. Это же linux. Программа изменила данные. Значит программа знает что делает. А если незнает, то плохая программа. (меняем программу на пользователь и получаем философию linux)

PPS а зафига вам, извиняюсь, сообщение об изменении программе, которая их вносит?

PPPS Мб это логика БД в linux?

Неправильно мыслишь. Части изменения и реагирования на изменения могут быть совсем не взаимосвязаны.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
fte
Гость
« Ответ #9 : Сентябрь 26, 2012, 12:22 »

Все-таки напишите для начала "правильную" триггерную функцию
Код:
BEGIN
       NOTIFY classif_n;
       RETURN new;
END;

PS: у меня сервер по FreeBSD, клиент под XP - все работает как надо
Записан
fte
Гость
« Ответ #10 : Сентябрь 26, 2012, 12:30 »

Да кстати, при добавлении записи все-таки надо пользоваться транзакциями!

QSqlDatabase.transaction();
QSqlDatabase.commit();
QSqlDatabase.rollback();

нотифая не будет пока не закончится транзакция!

 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Сентябрь 26, 2012, 12:34 »

QSqlQuery внутри использует транзакцию на каждый exec, на сколько я помню.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
fte
Гость
« Ответ #12 : Сентябрь 26, 2012, 13:18 »

Не поленился посмотрел исходники, не нашел нигде, чтобы QSqlQuery использовал QSqlDarabase.transaction()
и вообще с какого он должен использовать внутри транзакции? А если мне надо обернуть в транзакцию два инсерта в разные таблицы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Сентябрь 26, 2012, 13:30 »

Не поленился посмотрел исходники, не нашел нигде, чтобы QSqlQuery использовал QSqlDarabase.transaction()
и вообще с какого он должен использовать внутри транзакции? А если мне надо обернуть в транзакцию два инсерта в разные таблицы?
Или это только с SQLite было... Не помню уже. Улыбающийся
А транзакция используется, если явной нет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
fte
Гость
« Ответ #14 : Сентябрь 26, 2012, 13:55 »

Цитировать
Здесь видно, что данное приложение два раза посылало запрос INSERT, а в итоге пришло три сигнала. Пришли они после того, как в другом приложении был выполнен аналогичный запрос INSERT.

Вот это очень похоже, на то что висит незакрытая транзакция..... когда ее "захлопнули" пользователь получил чохом все три нотифая....
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.161 секунд. Запросов: 22.