关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
四年前关门了。
改进这个问题
我有一个网页,我在mysql表中使用crud操作进行一些数据操作。有许多桌面客户端应用程序的运行示例与同一个数据库进行通信,每次我通过网页对此数据库进行更改时,所有这些客户端都需要得到更改的通知。我真的不知道如何处理这个问题。桌面客户端应用程序是用c#编写的。我还知道,至少在mysql中,使用ado.net provider无法异步通知桌面客户端数据库中发生的更改。
当客户机应用程序定期创建数据库连接并检查mysql表的更改时,有一个选项。但是,如果我们有1000个正在运行的示例,每个示例都创建连接,并且每2秒读取一个表呢?这不是非常消耗数据库服务器资源吗?
此外,我们还可以在insert/update/delete上编写触发器,用于填充另一个关于所做更改的表,然后我们将轮询这个新的“changes\u made”表。
还有一个创建socket服务器的选项,该服务器轮询“changes\u made”表,如果进行了更改,则将更改数据发送到所有桌面客户端,这些客户端在此上下文中是socket侦听器。因此,我们将摆脱客户端进行的轮询,并显著减少数据库连接的总量和数据库的负载。
在这里我想知道什么是最正确和可扩展的方法来解决这些任务。
1条答案
按热度按时间9udxz4iz1#
当然,通知客户对数据库所做的更改并不是完全不可能的,尽管没有内置的解决方案。
在mysql中,您可以用c/c++创建已编译的用户定义函数(udf)。这些可以扩展mysql的功能,几乎任何你想要的方式-例如通过网络发送消息。您可以创建自己的自定义项,也可以使用mysqludf.org上的库通过网络发送消息。你可以从mysqludf.org上的stomp库开始发送stomp消息。由于stomp与语言无关,因此您也可以在.net环境中使用它,请参阅本so主题(如果在internet上搜索.net stomp服务器,则会找到更多示例)。
客户机应用程序必须实现能够从服务器接收stomp消息的stomp服务器。
在数据库中,您需要创建一个订阅表,该表包含客户机订阅的通知以及如何连接到它的信息(至少包括ip地址/主机名和端口号)。
您还需要在所有要发送通知的表和事件上创建触发器。
我还将创建一个存储过程或函数,用于接收修改后的数据或某个表已从触发器中更改的事实,检查订阅表,创建stomp消息,然后调用已编译的udf,将stomp消息发送给所有订阅的客户端。触发器将调用此存储过程或函数,而不是在每个触发器中实现所有这些功能。
需要修改客户端以处理通知并采取进一步的操作或提示用户。
免责声明:我并不声称这是最充分和可扩展的解决方案,为您的特殊情况。但是,通过这种方式,您可以自行实现通知系统,而无需轮询数据库。