Какой лучший способ для клиентского приложения немедленно реагировать на обновление в базе данных?

Каков наилучший способ запрограммировать немедленную реакцию на обновление данных в базе данных?

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

Я полагаю, что какой-то способ, в конце концов, похоже, что веб-приложение, такое как gmail, может обновить мой почтовый ящик почти сразу после отправки нового письма. Конечно, мой клиент постоянно не проверяет обновления. Я думаю, что они делают это с AJAX, но как AJAX может вести себя как удаленный вызов функции, которого я не знаю. Мне было бы интересно узнать, как это делает gmail, но мне больше всего хотелось бы узнать, как это сделать в общем случае с базой данных.

Изменить: Обратите внимание: я хочу немедленно отреагировать на обновление в клиентском коде, а не в самой базе данных, так как я знаю, что триггеры не могут этого сделать. В основном я хочу, чтобы ПОЛЬЗОВАТЕЛЬ получал уведомление или обновлял свой экран после внесения изменений в базу данных.

Ответ 1

В основном у вас есть две проблемы:

  • Вы хотите, чтобы браузер мог получать асинхронные события с сервера веб-приложений без опроса в узком цикле.

  • Вы хотите, чтобы веб-приложение получало асинхронные события из базы данных без опроса в узком цикле.

Для задачи №1

Смотрите эти ссылки в Википедии для тех методов, которые, как я думаю, вы ищете:

EDIT: 19 марта 2009 г. - натолкнулся на ReverseHTTP, который может представлять интерес для проблемы №1.

Для задачи № 2

Решение будет специфичным для той базы данных, которую вы используете, и, вероятно, для драйвера базы данных, который использует ваш сервер. Например, PostgreSQL вы бы использовали LISTEN и NOTIFY. (И рискуя быть проголосовавшим, вы, вероятно, используете триггеры базы данных для вызова команды NOTIFY при внесении изменений в данные таблицы.)

Еще один возможный способ сделать это, если в базе данных интерфейс для создания хранимых процедур или триггеров, которые ссылаются на динамическую библиотеку (т.е., DLL или .so файл). Затем вы можете написать код сигнализации сервера в C или что угодно.

В той же теме некоторые базы данных позволяют писать хранимые процедуры на таких языках, как Java, Ruby, Python и другие. Возможно, вы сможете использовать один из них (вместо того, что компилируется для машинного кода DLL, например, C) для механизма сигнализации.

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

Ответ 2

Я полагаю, что должен быть какой-то способ, после все, веб-приложение, подобное gmail, похоже обновить свой почтовый ящик почти сразу после того как новое письмо было отправлено мне. Конечно, мой клиент не постоянно постоянно проверяя наличие обновлений. я подумайте, как они это делают, с AJAX, но как AJAX может вести себя как удаленный вызов функции я не знаю. Я бы быть любопытным, чтобы знать, как gmail делает это, но то, что я больше всего хотел бы знать как это сделать в общем случае с базой данных.

Возьмите взгляд с wirehark когда-нибудь... там некоторый трафик google происходит там довольно регулярно, он появляется.

В зависимости от вашей базы данных триггеры могут помочь. Приложение, которое я написал, полагается на триггеры, но я использую механизм опроса, чтобы "знать", что что-то изменилось. Я бы сказал, если вы не можете сообщить об изменении из БД, мне нужен какой-то механизм опроса.

Только мои два цента.

Ответ 3

Ну, лучший способ - это база данных trigger. Зависит от способности вашей СУБД, которую вы не указали, для их поддержки.

Повторите свое редактирование: как это делают приложения, подобные Gmail, на самом деле, с опросом AJAX. Установите Tamper Data расширение Firefox, чтобы увидеть его в действии. Трюк заключается в том, чтобы ваш запрос опроса был ослепляющим в случае "без новостей".

Ответ 4

К сожалению, нет способа переместить данные в веб-браузер - вы можете отправлять данные только в ответ на запрос - это просто способ работы HTTP.

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