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




Вы можете поместить триггер INSERT / UPDATE / DELETE в таблицу, чтобы выполнить какое-либо действие при внесении в таблицу изменений «данных». (в отличие от изменений в структуре таблицы)
Я считаю, что 10g также поддерживает триггеры по просмотрам.
но я не уверен, как вы можете уведомить java-процесс об этом другом, а не с помощью опроса.
Извините.
вы могли бы создать какое-то решение, в котором у java-приложения есть сервер прослушивания, а база данных отправляет ему сообщение. но это звучит трудно поддерживать.
Джастин Кейв в комментариях предполагает, что вы можете настроить Oracle Streams для отправки записей логических изменений (LCR), на которые приложение Java может подписаться через JMS. Или триггер может записывать записи в расширенную очередь, на которую Java может подписаться через JMS.
вам все равно придется опасаться переходов Oracle .. из-за того, как работают транзакции Oracle, триггер срабатывает при изменении, но он также может срабатывать несколько раз.
и в любом случае приложение java не сможет «увидеть» изменения, пока не будет выполнена фиксация.
В зависимости от того, насколько тяжелой должна быть архитектура, вы можете настроить Oracle Streams для отправки записей логических изменений (LCR), на которые приложение Java может подписаться через JMS. Или триггер может записывать записи в расширенную очередь, на которую Java может подписаться через JMS.
Проблема в том, что Streams работает на уровне объекта, не уверен, что вы можете настроить Streams для отправки LCR для представления. Является ли представление таким, что вы можете идентифицировать несколько таблиц, на которые нужно подписаться на изменения, а затем опрашивать представление, чтобы узнать, действительно ли изменилась интересующая вас строка?
Хотя верно, что триггеры могут запускаться несколько раз с откатом между ними, Oracle AQ / Streams является транзакционным, поэтому действие постановки в очередь также будет откатано. Единственная проблема будет, если вы сделали что-то, что нельзя откатить в триггере (например, отправили электронное письмо).
К вашему сведению, я только что узнал, когда изучал Oracle Streams, они отказались от этой технологии в Oracle 12c, чтобы заменить ее другой под названием GoldenGate, которая, похоже, пытается удовлетворить ряд потребностей, связанных с репликацией и потоковой передачей данных во внешние источники.
Посмотрите на Уведомление об изменении Oracle, очень интересную возможность Oracle.
Из документации Oracle: «Уведомление об изменении базы данных - это функция, которая позволяет клиентским приложениям регистрировать запросы в базе данных и получать уведомления в ответ на изменения DML или DDL в объектах, связанных с запросами. Уведомления публикуются базой данных, когда транзакция DML или DDL фиксируется. "
Похоже, это работает только для обратных вызовов PL / SQL или C, но это в значительной степени то, что мне нужно, спасибо - теперь, как подключить его к java-приложению ... :)
Я считаю, что Oracle может вызывать хранимые процедуры Java, я просто не знаю, как это делать. Однако oracle.com/technology/sample_code/tech/java/jsp/… может помочь.
Отслеживание изменений в таблице базы данных - это «запах дизайна». Вам следует подумать о внедрении событийно-управляемой архитектуры (EDA), поддерживаемой служебной шиной предприятия (ESB). Например, Mule (www.mulesoft.com).