Триггеры postgresql - определение глобального ресурса (java)

У меня есть сервер PostgreSQL, и мне нужно запускать некоторый код всякий раз, когда происходит обновление какой-либо таблицы. Триггеры PostgreSQL (использующие PL/java) позволяют мне вызывать статический метод java. Метод, который мне нужно выполнить, выполняет RPC для внешнего сервера с информацией об обновлении.

Чего я не мог понять, так это как я могу создать глобальный ресурс (в данном случае сетевое соединение с внешним сервером), который сохраняется при вызовах.

Одним из способов, вероятно, является создание статических переменных для глобальных ресурсов. Когда мой триггерный метод вызывается в первый раз, инициализируйте эти переменные. В последующих звонках просто используйте его. Будет ли это работать, и есть ли другой способ?

Что бы мне понравилось, так это общий интерфейс триггера, который я мог бы реализовать для своего триггера.

2 ответа

Решение

Даже если бы вы сделали это - это было бы "глобально" только для данного сеанса - не для многих сеансов.

Но - дело спорный вопрос, потому что, как я понимаю, подход неправильным.

Вместо добавления триггера, который подключается к внешней системе, я бы предпочел:

  1. создать триггер, который использует NOTIFY для информирования об изменении
  2. добавить приложение, которое LISTEN s для уведомлений и выполняет удаленную работу.

Исходя из ответа depesz и еще нескольких поисков в интернете - это лучшее решение моей ситуации:

Есть способ для клиента выдать LISTEN xyz; заявление на сервер. затем NOTIFY xyz; Заявление может быть оформлено на сервере, и клиент будет уведомлен. xyz используется для определения того, что произошло. NOTIFY Кроме того, оператор позволяет отправлять "полезные данные" (поддерживается только в PostgreSQL 9+, последней версии на данный момент).

Разумной реализацией будет связывание триггера на основе обновления таблицы. Этот триггер выдает NOTIFY заявление клиенту, а полезная нагрузка содержит обновленные данные строки.

У этой реализации есть один недостаток - драйвер JDBC (интерфейс Java для подключения к серверу PostgreSQL) не поддерживает действительно асинхронное поведение. Слушатель должен выполнить фиктивный запрос для подключения к бэкэнду (обновление - фиктивный запрос не требуется: http://goo.gl/VbFQg. Тем не менее, опрос все еще), и только тогда все ожидающие уведомления будут доставлены клиенту. Также обратите внимание, что расширения LISTEN/NOTIFY для SQL относятся только к PostgreSQL и не являются частью стандарта SQL.

Ссылки: УВЕДОМЛЕННАЯ документация для PostgreSQL, страница документации JDBC для прослушивания / уведомления

Другие вопросы по тегам