Здравствуйте, 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 объекта, который был изменен и реализуйте ее мониторинг обычным селектом. Будет и проще и надежней.