【问题标题】:Listen to database changes in MySQL [closed]监听 MySQL 中的数据库更改 [关闭]
【发布时间】:2016-01-22 10:40:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这个问题很宽泛,很容易变成资源请求。保持它不是资源请求,我最近用原生非 3rd 方链接回答了here。

标签: c# mysql sockets


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2012-03-03
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多