Триггеры postgresql - определение глобального ресурса (java)
У меня есть сервер PostgreSQL, и мне нужно запускать некоторый код всякий раз, когда происходит обновление какой-либо таблицы. Триггеры PostgreSQL (использующие PL/java) позволяют мне вызывать статический метод java. Метод, который мне нужно выполнить, выполняет RPC для внешнего сервера с информацией об обновлении.
Чего я не мог понять, так это как я могу создать глобальный ресурс (в данном случае сетевое соединение с внешним сервером), который сохраняется при вызовах.
Одним из способов, вероятно, является создание статических переменных для глобальных ресурсов. Когда мой триггерный метод вызывается в первый раз, инициализируйте эти переменные. В последующих звонках просто используйте его. Будет ли это работать, и есть ли другой способ?
Что бы мне понравилось, так это общий интерфейс триггера, который я мог бы реализовать для своего триггера.
2 ответа
Даже если бы вы сделали это - это было бы "глобально" только для данного сеанса - не для многих сеансов.
Но - дело спорный вопрос, потому что, как я понимаю, подход неправильным.
Вместо добавления триггера, который подключается к внешней системе, я бы предпочел:
Исходя из ответа depesz и еще нескольких поисков в интернете - это лучшее решение моей ситуации:
Есть способ для клиента выдать LISTEN xyz
; заявление на сервер. затем NOTIFY xyz
; Заявление может быть оформлено на сервере, и клиент будет уведомлен. xyz
используется для определения того, что произошло. NOTIFY
Кроме того, оператор позволяет отправлять "полезные данные" (поддерживается только в PostgreSQL 9+, последней версии на данный момент).
Разумной реализацией будет связывание триггера на основе обновления таблицы. Этот триггер выдает NOTIFY
заявление клиенту, а полезная нагрузка содержит обновленные данные строки.
У этой реализации есть один недостаток - драйвер JDBC (интерфейс Java для подключения к серверу PostgreSQL) не поддерживает действительно асинхронное поведение. Слушатель должен выполнить фиктивный запрос для подключения к бэкэнду (обновление - фиктивный запрос не требуется: http://goo.gl/VbFQg. Тем не менее, опрос все еще), и только тогда все ожидающие уведомления будут доставлены клиенту. Также обратите внимание, что расширения LISTEN/NOTIFY для SQL относятся только к PostgreSQL и не являются частью стандарта SQL.
Ссылки: УВЕДОМЛЕННАЯ документация для PostgreSQL, страница документации JDBC для прослушивания / уведомления