c# - 监听 MySQL 中的数据库变化

标签 c# mysql sockets

<分区>

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

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

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

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

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

最佳答案

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

在 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给所有订阅的客户。触发器将调用此存储过程或函数,而不是在每个触发器中实现所有这些功能。

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

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

关于c# - 监听 MySQL 中的数据库变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944674/

相关文章:

Java Socket 客户端向设备发送额外的字节

c# - 获取列表框Windows Phone 7的选定值

c# - 如何在 Windows 10 通用应用程序上获取配对的蓝牙设备列表

mysql - 在 HIVE 插入查询中,为什么 from 子句在开头?

c++ - 如何使用 boost::asio 连接到 unix 域套接字?

java - 使用线程处理套接字

c# - .NET Core 3.0 StringEnumConverter 未序列化为字符串

javascript - 在 iFrame 中加载时 Asp.Net 页面抛出错误

php - 在同一页面上显示 mysql 结果

php - MySQL Codeigniter - $this->db->query 和 CLI 结果不匹配