триггеры postgresql - определение глобального ресурса (java) - PullRequest
0 голосов
/ 23 декабря 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

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

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

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

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

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

У клиента есть способ выдать LISTEN xyz;заявление на сервер.Тогда NOTIFY xyz;Заявление может быть выдано на сервере, и клиент будет уведомлен.xyz используется для идентификации того, что произошло.Оператор NOTIFY также позволяет посылать с ним «полезную нагрузку» (поддерживается только в PostgreSQL 9+, последней версии на данный момент).

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

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

Ссылки: Документация NOTIFY для PostgreSQL , Страница документации JDBC дляслушать / уведомит

...