Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

5年前关闭。



Improve this question




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

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

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

10-04 21:25
查看更多