2015-09-13 2 views
3

Я разрабатываю приложение Delphi XE7 с данными, хранящимися в онлайн-базе данных Mysql. Для доступа к базе данных я использую FireDAC. Поскольку приложение может использоваться на нескольких компьютерах одновременно, мне нужно получить уведомление, когда таблица будет изменена, поэтому я могу обновить отображаемую информацию на каждом компьютере. FireDAC имеет компонент под названием TFDEventAlerted, который звучал точно так, как мне нужно для этого. Но этот компонент дает ошибку при активации (Call Register): [FireDAC] [Phys] [MySQL] -303. Способность не поддерживается. Я не уверен, что это значит, но, прочитав больше о компоненте, кажется, что Mysql не поддерживает этот тип событий? Если это так: может ли кто-нибудь сказать мне, есть ли другое решение для достижения того же?Как получить уведомления о базе данных MySQL в Delphi?

Любая помощь будет оценена, поскольку я не могу найти подходящее решение.

+6

MySQL не может этого сделать. Если бы я был вами, я бы разработал промежуточное приложение/службу, которая взаимодействует с db. Приложение frontend взаимодействует только с промежуточным программным обеспечением.С помощью шаблона наблюдателя можно легко уведомить всех слушателей (например, интерфейсные приложения), когда обновления появляются на db. – whosrdaddy

ответ

2

У родного MySQL нет функции push-уведомления, которую вы надеетесь использовать. Чтобы выполнить эту работу, вам нужно будет опросить (чтобы регулярно запускать запрос), чтобы искать изменения.

Есть несколько способов преодолеть это ограничение, если масштаб вашей системы делает опрос неосуществимым. Вы можете добавить определенную пользователем функцию на свой сервер MySQL, как этот для отправки сообщений: https://github.com/mysqludf/lib_mysqludf_stomp#readme

Это не сработает, если у вас нет сервера MySQL; большинство хостинговых услуг не позволят вам устанавливать UDF.

Или вы можете создать приложение для публикации/подписания сообщения. Это довольно легко сделать с простой службой массового обслуживания Amazon или с помощью rabbitmq. Но это другой вид системного дизайна, из которого вы, вероятно, привыкли.

+0

Я не владею сервером базы данных, поэтому UDF не будет возможен. Я рассмотрю RabitMQ позже. В другом проекте я использовал Postgresql, который поддерживает эти уведомления в базе данных, но я столкнулся с проблемами, потому что каждый клиентский IP-адрес необходимо было добавить отдельно службой хостинга. Большинство хостинговых услуг даже не позволяют этого. Это заставило меня принять решение использовать Mysql для этого проекта. –

+0

Будьте осторожны с базами данных MySQL, открытых для общедоступной сети. Потому что киберпреступники. Используйте ssl-соединения, если сможете. –

2

В моем article series около Firebird Database Events Я предложил решение на основе ориентированного на сообщения промежуточного программного обеспечения. Средний уровень вашего приложения затем уведомит все заинтересованные стороны о некоторых событиях базы данных. Код среднего уровня будет независимым от базы данных, все, что вам нужно, это брокер сообщений, который специализируется на надежной доставке сообщений. Мнимый пример для «» после поста обработчика события приведен ниже:

procedure TAppDataModule.PurchaseOrderAfterPost(DataSet: TDataSet); 
var 
    Notification: INotification; 
begin 
    Notification := NotificationService.CreateNotification(PURCHASE_ORDER_TABLE_UPDATED); 
    Notification.SetIntProperty(PURCHASE_ORDER_ID, PurchaseOrderID.AsInteger); 
    NotificationService.Send(Notification); 
end; 

Популярных брокеров сообщения бесплатно/НЬги с открытым исходным кодом, например Apache ActiveMQ и RabbitMQ.

+0

Правильно ли я понимаю, что мне нужно запустить службу на сервере базы данных для этого решения? К сожалению, это невозможно, потому что база данных должна работать на хостинге. –

+0

@MarkBroek, поэтому доступ к базе данных осуществляется непосредственно через Интернет, без какого-либо среднего уровня (сервер приложений или REST)? – mjn

+0

Ну, да. Я использую компоненты FireDAC для установления соединения с онлайн-базой данных. Хостинг-провайдер дает возможность добавлять хосты доступа для db. Здесь я добавляю IP-адреса клиента. Таким образом, доступ ограничен только ограниченным числом IP-адресов. –

1

TFDEventAlerted Управление не для базы данных MySQL. Эта база данных не поддерживает модель событий. Если вы хотите обновлять данные в «режиме реального времени», то вы должны добавить вручную запрос на измененных данных

Вот шаги:

  1. Добавить новое поле в таблице базы данных, как «LAST_UPDATED»;

  2. Заполните это поле значением now() при обновлении или вводе действий (по триггеру или sql);

  3. Добавить таймер в приложение delphi и добавить запрос для последнего обновленного времени;

  4. Если это время новое, тогда запрашивают обновленные данные на SELECT * FROM my_table WHERE last_updated >= :need_last_updated.

+0

Благодарим вас за подробные шаги! Хотя это не идеально, так как приложение будет работать медленнее, а обновления не будут в реальном времени, это действительно может быть решением. –