收听MySQL中的数据库更改

时间:2016-01-22 10:40:37

标签: c# mysql sockets

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

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

此外,我们可以在插入/更新/删除时编写触发器,其中填充了另一个表格,并在此之后我们将轮询这个新的“changes_made”表。

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

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