[英]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 ActiveMQ和RabbitMQ 。
TFDEventAlerted
控件不适用于MySQL数据库。 该数据库不支持事件模型。 如果要“实时”更新数据,则必须添加对已更改数据的手动请求
以下是步骤:
将新字段添加到数据库表中,如“last_updated”;
通过now()
值更新或插入操作(通过触发器或sql)填充该字段;
将计时器添加到delphi应用程序并通过SELECT MAX(last_updated) AS last_updated FROM my_table
添加请求以获取最后更新时间;
如果该时间是新的,则通过SELECT * FROM my_table WHERE last_updated >= :need_last_updated
请求更新的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.