Блокируйте SELECT до тех пор, пока результаты не будут доступны - PullRequest
4 голосов
/ 13 августа 2010

Я пытаюсь написать PHP-скрипт для «длинного опроса», возвращающий данные при добавлении новых строк в таблицу базы данных (Postgres). Есть ли способ получить запрос SELECT для возврата только тогда, когда он будет возвращать результаты, блокируя в противном случае? Или я должен использовать другой механизм сигнализации вне базы данных?

Ответы [ 5 ]

4 голосов
/ 13 августа 2010

Посмотрите на LISTEN / NOTIFY:

Команда NOTIFY отправляет событие уведомления каждому клиентскому приложению, которое ранее выполнило имя LISTEN для указанного имени уведомления в текущей базе данных

http://www.postgresql.org/docs/8.4/static/sql-notify.html

Вы можете добавить триггер «ON INSERT» к таблице, чтобы вызвать событие NOTIFY.Однако вам понадобится другой механизм для определения , какие записи должны быть выбраны, поскольку возможность доставки полезной нагрузки с событием NOTIFY не будет доступна до 9.0:

http://www.postgresql.org/docs/9.0/static/sql-notify.html

2 голосов
/ 13 августа 2010

блокирующий оператор выбора отсутствует.

Вы можете просто выполнить оператор выбора на регулярной основе, что влечет за собой определенные накладные расходы.Если запрос дорогой, вы можете написать более дешевый, например, count (*), и отслеживать новые записи, которые могут быть возвращены, и, если число меняется, выполнить более дорогой запрос.

0 голосов
/ 18 августа 2010

Я люблю postgres и все такое, но если вы пытаетесь сделать что-то простое, а не сверх предпринимательство, возможно, вам будет достаточно redis. У меня был большой успех с его использованием, и он может масштабироваться.

http://code.google.com/p/redis/

0 голосов
/ 13 августа 2010

Вы пытаетесь получить прерывание (событие), когда вам, вероятно, следует подумать о опросе.

Создайте и вызовите хранимую процедуру, которая определит, есть ли новые строки, которые клиент должен получить.Если это веб-приложение, периодически вызывайте метод Ajax, который на сервере будет запрашивать базу данных, чтобы увидеть, есть ли новые строки с момента его последнего вызова.Если это так, выполните другой запрос, чтобы получить их и отправить обратно клиенту.

0 голосов
/ 13 августа 2010

Вы можете посмотреть на LOCK и FOR UPDATE.FOR UPDATE может позволить запросу ждать, пока выбранные строки не будут разблокированы.Я не уверен, есть ли тайм-аут или какое влияние на ресурсы может оказать их большое количество, но это одна возможность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...