在C#中,当有人插入、删除或修改记录时,我如何从MySQL中获得事件?

x33g5p2x  于 2023-02-07  发布在  Mysql
关注(0)|答案(2)|浏览(156)

我正在用WPF.Net开发一个程序,我需要知道什么时候有人对数据库的任何表进行了更改。
这个想法是从数据库接收一个事件时,它被改变了。我阅读了很多文章,但我找不到一个方法来解决我的问题。
此致

suzh9iv8

suzh9iv81#

最好的解决方案是使用消息队列。在应用向数据库提交更改后,应用还会在消息队列中发布消息。其他客户端只需等待该消息队列中的通知。
还有一些其他常见的解决方案,但它们都有缺点。

**轮询。**如果客户端对最近的更改感兴趣,则它们每N秒运行一次查询来搜索新数据。

缺点是即使在没有更改的时候也必须保持轮询。您可能必须非常频繁地轮询,这取决于您需要多快地注意到更改。这会增加数据库负载,只是为了支持轮询查询。
此外,如果您有许多客户端都轮询查询,则成本更高。在我支持的一个系统中,仅为运行轮询的客户端,数据库就难以每秒处理30,000个查询。

**变更数据捕获。**使用二进制日志作为事实上的消息队列,因为它记录了所有的变更。使用客户端工具,如Debezium,或编写自己的二进制日志尾客户端(这是一项大量的工作)。

缺点是binlog记录了所有的修改,而不仅仅是那些你想被通知的修改。你必须以某种方式过滤它。你还必须学习如何使用Debezium或等效的工具。

**触发器。**在表上编写一个触发器,该触发器调用UDF以在数据库外部发布通知。这不是一个好主意,因为触发器在执行插入/更新/删除时执行,而不是在提交事务时执行。客户机可以在提交更改之前收到更改通知,因此如果客户机在收到通知后立即查询数据库,则还看不到更改。

这也是一个缺点,因为它需要你在MySQL服务器上安装一个UDF扩展。MySQL通常没有任何方法来发布一个外部通知。
我不是一个C#开发人员,所以我不能建议具体的代码。但上面的一般方法是相似的,无论应用程序是用哪种语言编写的。

vltsax25

vltsax252#

我不认为这是可能的MySQL,像MondgoDB的数据库有这种功能。
您可能希望使用this answer中介绍的方法。
本质上是在行上有日期/时间字段,您可以从其中提取自某个日期时间以来的数据。或者您可以使用CQRS/事件策略,也可以使用消息队列。

相关问题