繁体   English   中英

如何在Delphi中接收MySQL数据库通知?

[英]How to receive MySQL database notifications in Delphi?

我正在开发一个Delphi XE7应用程序,其数据存储在一个在线的Mysql数据库中。 对于数据库访问,我使用FireDAC。 因为应用程序可以同时在多台计算机上使用,所以我需要在更改表时收到通知,这样我就可以更新每台计算机上显示的信息。 FireDAC有一个名为TFDEventAlerted的组件,听起来就像我需要的那样。 但是这个组件在激活时会发出错误(调用Register):[FireDAC] [Phys] [MySQL] -303。 不支持功能。 我不确定这意味着什么,但在阅读了有关该组件的更多内容后,似乎Mysql不支持这种类型的事件? 如果是这样的话:谁能告诉我是否有另一种解决方案可以实现同样的目标?

任何帮助将不胜感激,因为我似乎无法找到一个好的解决方案。

原生MySQL没有您希望使用的推送通知功能。 要完成这项工作,您需要轮询(定期运行查询)以查找更改。

如果您的系统规模使得轮询不可行,有一些方法可以克服此限制。 您可以向MySQL服务器添加用户定义的函数,就像发送消息一样: https//github.com/mysqludf/lib_mysqludf_stomp#readme

如果您不拥有MySQL服务器,这将不起作用; 大多数托管服务都不允许您安装UDF。

或者,您可以构建消息发布/订阅应用程序。 使用Amazon简单排队服务或使用rabbitmq非常容易。 但它与您可能习惯的系统设计不同。

在我关于Firebird数据库事件的 系列文章中,我提出了一种基于消息的中间件的解决方案。 然后,您的应用程序的中间层将通知所有相关方关于某些数据库事件。 中间层代码与数据库无关,您只需要一个专门从事可靠消息传递的消息代理。 “post after”事件处理程序的一个虚构示例如下所示:

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 ActiveMQRabbitMQ

TFDEventAlerted控件不适用于MySQL数据库。 该数据库不支持事件模型。 如果要“实时”更新数据,则必须添加对已更改数据的手动请求

以下是步骤:

  1. 将新字段添加到数据库表中,如“last_updated”;

  2. 通过now()值更新或插入操作(通过触发器或sql)填充该字段;

  3. 将计时器添加到delphi应用程序并通过SELECT MAX(last_updated) AS last_updated FROM my_table添加请求以获取最后更新时间;

  4. 如果该时间是新的,则通过SELECT * FROM my_table WHERE last_updated >= :need_last_updated请求更新的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM