2014-10-15 1 views
0

Я пытаюсь понять, как приложение java (client), которое через JDBC связывается с базой данных (сервером) pgSQL, может «поймать» результат, созданный запросом, который будет запущен (с помощью триггера) всякий раз, когда запись вставляется в таблицу.Как клиентское приложение Java. может «поймать» (через JDBC) результат, созданный запросом процедуры триггера?

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

Интересно, поддерживает ли JDBC какой-либо механизм «обратного вызова», способный улавливать результаты, создаваемые запросом, который запускается с помощью процедуры запуска в соответствии с условием «INSERT INTO table». И если такого механизма «обратного вызова» нет, каков наилучший подход для достижения этого результата?

Спасибо заранее :)

+0

Не знаю, о чем я знаю. Триггеры запускаются полностью в контексте сервера базы данных без знания JDBC. Это очень идиома запроса/ответа, а не двусторонняя сотовая связь. – duffymo

ответ

1

Триггеры не может возвращать результирующий набор.

Невозможно отправить такой результат драйверу JDBC.

Есть несколько грязных хаков, которые вы можете использовать для получения результатов от триггера клиенту, но все они точно такие. Такие вещи, как:

  • DECLARE курсор на результирующем, а затем отправить имя курсора в качестве NOTIFY полезной нагрузки, так что приложение может FETCH ALL FROM <cursorname>;

  • Создать TEMPORARY таблицу и сообщить имя через NOTIFY

Это более характерно для добавления ничего триггер должен общаться с приложением к таблице, которая существует для этой цели, и есть приложение SELECT от него после операции, которая запускала спусковой крючок.

В большинстве случаев, если вам нужно это сделать, вы, вероятно, используете триггер, где правильная функция лучше подходит.

+0

Итак, чтобы было ясно, что нет механизма «стандартного» (без обходного пути), который база данных pgSQL может использовать для уведомления клиентского приложения (написанного в java) о «чем-то», которое может возникнуть в схеме базы данных, правильно? База данных и их клиенты могут обмениваться данными только через парадигму клиент-сервер, и невозможно, чтобы база данных возвращала события для своих клиентов, не так ли? И клиенты всегда несут ответственность за * poll * базу данных, чтобы знать о том, что происходит с их данными. –

+0

@DiogoAnjos Это именно то, для чего нужны 'LISTEN' и' NOTIFY'. Они не являются стандартами SQL, но обычно используются в PostgreSQL. Вот почему я упоминаю «NOTIFY» выше. Существует поддержка для получения уведомлений в PgJDBC. См. Http://jdbc.postgresql.org/documentation/93/listennotify.html. –

 Смежные вопросы

  • Нет связанных вопросов^_^