Alf162
@Alf162

«Подписаться» на событие в БД

Здравствуйте!
Проблема заключается в следующем: существует приложение на php, которое отображает информацию из БД. База заполняется десктопным приложением на Delphi. Мне необходимо отреагировать на появление новой записи в базе: отобразить ее пользователю. Сейчас это реализовано через таймер+ajax. Получить какой-то сигнал от приложения, добавляющего информацию в таблицу невозможно. Вариант с node.js тоже не очень подходит. Есть ли другие способы, более культурные?
  • Вопрос задан
  • 3904 просмотра
Пригласить эксперта
Ответы на вопрос 5
Den1xxx
@Den1xxx
Наверное Вам нужно это:
http://habrahabr.ru/post/69457/
Позволяет держать постоянное соединение клиента с сервером:)
Ответ написан
Комментировать
@groaner
Не знаю насколько это может помочь в вашем случае, но Interbase/Firebird имеют встроенную поддержку событий — Overview of Firebird events
Ответ написан
Комментировать
EugeneOZ
@EugeneOZ
Нет. Есть long polling и websocket, но тут они не помогут, т.к. БД сообщение не отправит (да и сокет держать не станет). Только если «таймер» перенести в backend-скрипт, но смысла в данном случае нет, лишнее усложнение.
Ответ написан
Комментировать
beliyadm
@beliyadm
because open source matters
А если не заморачиваться, а после отправки информации из делфи в БД делать вызов нужной php функции (по последнему id или как -то еще), что получит этот новый объект и отобразит пользователю?
Да, не очень красиво, зато наименее затратно в плане разработок
Ответ написан
Комментировать
@dsd_corp
Тут вопрос не очень понятен, а что доступно вам из PHP? Это скрипт для веб-сервера? Он может быть запущенным постоянно, или он периодичен синхронно запросам из браузера?
Если может быть запущен постоянно, то выше groaner дал вам ссылку на описание событий в FireBird, сами события на серверной стороне можно постить из табличного триггера на insert, ловить их в PHP и дальше по смыслу.

А в целом для FireBird/Interbase можно можно по запросу из браузера дергать из базы даже не записи с момента чтения последней, а значение генератора, который используется для автоинкремента id в таблице — это будет проще для БД и быстрее. Если изменился генератор, тогда уже слать запрос новых записей.
Можно так же сделать «хранимую процедуру» на стороне сервера, отдающую новые данные, если они появились — большинство пакетных запросов через хранимую процедуру будут выполняться быстрее, чем с клиента их последовательно подавать(избавляемся от серии prepare для каждого запроса, т.к. «хранимка» сама по себе «подготавливается» еще в момент компиляции blr). В процедуру передавать последний прочитанный id, а она сама будет его сравнивать с генератором, и если что-то изменилось, тогда уж лезть в таблицу за записями и отдавать их клиенту, иначе отдавать пустой результат.
Точно так же можно и следить за измененными записями(не только добавленными): делаем в таблице еще одно поле, которое обновляется от генератора как при insert, так и при update, и следим за изменениями и вставками уже по этому, отдельному, генератору.
P.S. конечно, если у вас база не сильно нагружена, то слежение за генератором можно и опустить, всегда просто запрашивая таблицу напрямую на предмет наличия новых/измененных записей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы