收听MySQL中的数据库更改

我有一个网页,我使用CRUD操作在MySQL表中进行一些数据操作。 桌面客户端应用程序有很多正在运行的实例,它们与同一个数据库通信,每次我通过网页对这个数据库进行更改时,所有这些客户端都需要收到有关更改的通知。 我真的不知道如何处理这个问题的最佳方法。 桌面客户端应用程序是用C#编写的。 另外我知道,至少在使用ADO.NET提供程序的MySQL中,无法异步通知桌面客户端数据库中发生的更改。

当客户端应用程序定期创建数据库连接并检查MySQL表的更改时,有一个选项。 但是,如果我们有1000个正在运行的实例并且每个实例创建连接并且每2秒读取同一个表,该怎么办? 难道不是非常耗费数据库服务器资源吗?

此外,我们可以在插入/更新/删除时编写触发器,这些触发器填充另一个关于所做更改的表,之后我们将轮询这个新的“changes_made”表。

此外,还有一个选项可以创建套接字服务器,轮询“changes_made”表,如果进行了更改,则将更改数据发送到所有桌面客户端,这些客户端在此上下文中是套接字侦听器。 因此,我们将摆脱客户端进行的轮询,并显着减少数据库连接和数据库负载的总量。

在这里,我想知道什么是解决此类任务的最正确和可扩展的方法。

好吧,虽然没有内置的解决方案,但通知客户端对数据库所做的更改并非完全不可能。

在mysql中,您可以在C / C ++中创建编译的用户定义函数(UDF)。 这些可以以任何你想要的方式扩展mysql的function – 例如通过网络发送消息。 您可以创建自己的UDF或使用mysqludf.org上提供的库通过网络发送消息。 您可以从使用mysqludf.org上的STOMP库开始发送STOMP消息开始。 由于STOMP与语言无关,您也可以在.NET环境中使用它,请参阅此SO主题 (如果在Internet上搜索.net STOMP服务器,那么您将找到更多示例)。

客户端应用程序必须实现能够从服务器接收STOMP消息的STOMP服务器。

在数据库中,您需要创建一个订阅表,其中包含客户端订阅哪些通知以及如何连接它的信息(IP地址/主机名和端口号最少)。

您还需要在要发送通知的所有表和事件上创建触发器。

我还将创建一个存储过程或函数来接收已修改的数据或某个表已从触发器更改的事实,检查订阅表,创建STOMP消息,然后调用已发送的STOMP消息的编译UDF到所有订阅客户。 触发器将调用此存储过程或函数,而不是在每个触发器中实现所有这些function。

需要修改客户端以处理通知并采取进一步操作或提示用户。

免责声明:我并不认为这是针对您的特定情况的最充分和可扩展的解决方案。 但是,通过这种方式,您可以自行实施通知系统,从而无需轮询数据库。