Re: Subscription в OCI(oracle)
От: Vladimir Alekseev  
Дата: 22.10.15 14:41
Оценка: +2
Здравствуйте, collider, Вы писали:

C>Беда в том что

C> oci_error = pfn_OCISubscriptionRegister(pServiceContext, &subscrhp, 1, pError, OCI_DEFAULT);
C>a) Вызывает вопросы в firewall (windows 7)
C>b) И что совсем скверно, при запрете в firewall все равно возвращает 0.

Если мне не изменяет память, эта штука работает так:
a) Для каждой подписки создается отдельный поток, который открывает TCP листенер и ждет подключений с нотификациями от оракла. Т.е. подписка создается через существующее соединение, а нотификация будет через отдельное. На открытие порта, вероятно, и ругается firewall.
b) Соответственно, при подписке Оракловому клиенту не понять, что на порт, который он хочет открыть, никто не достучится, отсюда и OCI_SUCCESS сиречь 0.

C>1)Может кто подскажет как с этим можно бороться ? Если не с a) то хотя бы с b) как проверить, что Callback будет вызываться?


Проверить, что Оракл помнит про подписку можно по таблицам DBA_CHANGE_NOTIFICATION_REGS и USER_CHANGE_NOTIFICATION_REGS. Там можно посмотреть, на каком порту слушает ваша клиентская программа уведомления для данной конкретной нотификации и проверить, что эти порты открыты.

C>2)И еще вся эта хрень нужна, только для того, чтобы узнать, являются данные в памяти актуальными или их стоит перечитать.

C>Может быть есть готовые решения или еще какие возможности в oracle чтобы решить такую задачу?

Собственно самое главное. Опыт использования данного функционала показывает, что он не работает от слова совсем.
— Иногда подписка не создается вообще
— Иногда она фигурирует в таблицах (см. выше), но исчезает в тот момент, когда должна сработать нотификация (естественно, не порождая никакого события на клиенте)
— Все описанные эффекты могут возникать, а могут не возникать при идентичных версиях компонент, настройках firewall'а и пр. в зависимости от погоды на Марсе. У меня, например, была машина, на которой это просто не работало. Почему — неизвестно.

Вывод: рекомендую классическое решение — пишите в отдельную табличку "лог" — N операции, ID типа объекта, ID объекта, который был изменен и реализуйте ее мониторинг обычным селектом. Будет и проще и надежней.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.