监听MySQL数据库的更改

5
我有一个网页,并在MySQL表中使用CRUD操作进行一些数据操作。有许多正在运行的桌面客户端应用程序与相同的数据库通信,每当我通过网页进行更改时,所有这些客户端都需要被通知到更改。但我不知道如何最好地处理这个问题。桌面客户端应用程序是用C#编写的。同时,我知道至少在MySQL中使用ADO.NET提供程序异步通知桌面客户端关于发生在数据库中的更改是不可能的。
有一个选项是客户端应用程序定期创建数据库连接并检查MySQL表上的更改。但如果我们有1000个运行实例,并且每个实例每2秒就会创建连接并读取相同的表,那么这不会非常消耗数据库服务器资源吗?
还可以编写插入/更新/删除触发器,使其填充另一个表以记录所做出的更改,然后我们将轮询这个新的“changes_made”表。
此外,还有一种选择是创建套接字服务器,轮询“changes_made”表,如果有任何更改,则向所有桌面客户端发送更改数据,这些客户端在此上下文中作为套接字侦听器。因此,我们将摆脱客户端的轮询,并显着降低数据库连接和负载的总量。
在这里,我想知道解决这些任务的最正确和可扩展的方法是什么。

1
这个问题很广泛,很容易变成资源请求。为了避免成为资源请求,我最近在这里回答了一个具有本地非第三方链接的问题:http://stackoverflow.com/a/35381581 - Drew
1个回答

5
好的,虽然没有内置的解决方案,但是通知客户端数据库更改并不完全不可能。
在mysql中,您可以创建用C/C++编写的已编译用户定义函数(UDF)。这些函数可以以几乎任何你想要的方式扩展mysql的功能,例如通过网络发送消息。您可以创建自己的UDF或使用mysqludf.org上可用的库来发送网络消息。您可以从mysqludf.org开始使用STOMP库发送STOMP消息。由于STOMP是与语言无关的,因此您也可以从.NET环境中使用它,参见此SO主题(如果在互联网上搜索.net STOMP服务器,则会找到更多示例)。
客户端应用程序必须实现能够接收来自服务器的STOMP消息的STOMP服务器。
在数据库中,您需要创建一个订阅表,其中包含客户端订阅什么通知以及如何连接到它(最少需要IP地址/主机名和端口号)的信息。
您还需要在所有要发送通知的表和事件上创建触发器。
我还会创建一个存储过程或函数,该过程接收来自触发器的修改数据或某个表已更改的事实,检查订阅表,创建STOMP消息,然后调用已编译的UDF将STOMP消息发送给所有订阅的客户端。触发器将调用此存储过程或函数,而不是在每个触发器中实现所有这些功能。
客户端需要进行修改以处理通知并采取进一步操作或提示用户。
免责声明:我不断言这是您特定情况下最合适和可扩展的解决方案。但是,通过这种方式,您可以自己实现通知系统,避免需要轮询数据库。

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