将MySQL事件通知实现回到Delphi应用程序

6

你好,

有人能提供一些指导吗?我该如何通知我的Delphi应用程序某个MySQL数据库记录已更改?类似于Interbase的事件系统。

我考虑的想法:

.: Q4M :. (http://q4m.31tools.com/)

优点:原生MySQL解决方案,不需要外部守护进程 缺点:由于使用特定于Linux的Posix调用,因此不存在Win32版本

.: MySQL Message API :. (http://messagequeue.lenoxway.net/)

优点:强大(使用spread.org) 缺点:没有Win32二进制文件。需要spread.org的其他配置和守护进程

.: 自定义用户定义函数 :.

我正在尝试编写一个UDF,可以使用Win32 API PostMessage()向简单的套接字服务器发送Windows消息。

优点:与MySQL集成(尽管具有外部DLL依赖项)。可以根据我的需求进行自定义 缺点:我无法使其工作(请参见帖子MySQL User Defined Function to send a windows message)。这可能是因为MySQL正在作为服务运行

非常感谢任何指针、想法等。

--D


1
你是否考虑过使用独立于 SQL 服务器的通知系统? - Alex Jasmin
是的,我做了。但是应用程序中没有一个集中的地方进行数据库更改。即有时是通过直接TTable访问完成,有时是通过查询或存储过程完成。因此,在DB服务器上执行它可以提供一个很好的集中位置。 - TheEdge
2个回答

3
作为一种选择,您可以考虑使用中间层解决方案,例如RemObject DataAbstract或kbmMW。据我所知,它们允许在中间层跟踪更改,并提供机制通知客户端相关更改。

我希望避免中间层的复杂性。如果我选择这条路线,那么我会选择Spread和MySQL消息队列API。 - TheEdge

2
我最终的实现方式如下:
  • 创建了一个Windows应用程序,它监听TCP端口和Windows管道
  • 创建了一个MySQL用户定义函数(UDF),该函数将连接到上述Windows管道并发送一些信息
  • 向数据库中的表添加触发器,以调用带有关于哪个表、什么操作(插入、删除、更新)、主键值信息的UDF
  • TCP客户端现在可以连接到Windows应用程序,以接收从UDF传递的信息
  • TCP客户端可以根据需要使用检索到的信息进行刷新

这种方法效果很好,在带宽方面轻量级(因为客户端只会刷新所需的内容)。此外,将TCP服务器保持在与数据库相同的机器上,并使用Windows管道意味着可以保持管道处于打开状态,并通过向管道写入来消除TCP堆栈开销。这意味着对MySQL的负载和执行UDF所需的时间非常小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接