侦听 MySQL 中的数据库更改
本文关键字:数据库 MySQL 侦听 | 更新日期: 2023-09-27 18:31:36
我有一个网页,我使用 CRUD 操作在 MySQL 表中进行了一些数据操作。有很多正在运行的桌面客户端应用程序实例与同一个数据库通信,每次我通过网页在此数据库中进行更改时,所有这些客户端都需要收到有关更改的通知。而且我真的不知道如何处理这个问题的最佳方法。桌面客户端应用程序是用 C# 编写的。我也知道,至少在使用提供程序的 MySQL 中,没有办法异步通知桌面客户端数据库中 ADO.NET 更改。
当客户端应用程序定期创建数据库连接并检查更改 MySQL 表时,有一个选项。但是,如果我们有 1000 个正在运行的实例,并且每个实例每 2 秒创建连接并读取同一个表,该怎么办?会不会非常消耗数据库服务器资源?
此外,我们可以在插入/更新/删除时编写触发器,以填充另一个有关所做更改的表,之后我们将轮询这个新的"changes_made"表。
还有一个选项可以创建套接字服务器,该服务器轮询"changes_made"表,如果进行了更改,则将更改数据发送到在此上下文中作为套接字侦听器的所有桌面客户端。因此,我们将摆脱客户端进行的轮询,并显着减少数据库连接和数据库负载的总量。
在这里,我想知道解决此类任务的最正确和可扩展的方法是什么。
好吧,通知客户端对数据库所做的更改并非完全不可能,尽管没有内置的解决方案。
在mysql中,您可以在C/C++中创建编译的用户定义函数(UDF)。这些几乎可以以您想要的任何方式扩展 mysql 的功能 - 例如通过网络发送消息。您可以创建自己的 UDF 或使用 mysqludf.org 上可用的库通过网络发送消息。您可以从使用 STOMP 库开始 mysqludf.org 发送 STOMP 消息。由于 STOMP 与语言无关,因此您也可以从 .NET 环境中使用它,请参阅此 SO 主题(如果在 Internet 上搜索 .net STOMP 服务器,那么您将找到更多示例)。
客户端应用程序必须实现能够从服务器接收 STOMP 消息的 STOMP 服务器。
在数据库中,您需要创建一个订阅表,其中包含哪个客户端订阅了哪些通知以及如何连接到它的信息(至少是 IP 地址/主机名和端口号)。
您还需要在要发送通知的所有表和事件上创建触发器。
我还将创建一个存储过程或函数,用于接收修改后的数据或某个表已从触发器更改的事实,检查订阅表,创建 STOMP 消息,然后调用将 STOMP 消息发送到所有订阅客户端的编译 UDF。触发器将调用此存储过程或函数,而不是在每个触发器中实现所有这些功能。
需要修改客户端以处理通知并采取进一步操作或提示用户。
免责声明:我并不声称这是最适合您的特定情况的最充分和可扩展的解决方案。但是,通过这种方式,您可以自己实现通知系统,而无需轮询数据库。