如何同步来自SQL server表的近实时读取

本文关键字:server 读取 实时 SQL 何同步 同步 | 更新日期: 2023-09-27 18:08:28

我们有一个报告应用程序需要更新它的图表,因为数据被写入它的相应表。(该报告仅基于一张表)。目前,我们只是在内存中保留最后一次读取sessionid + rowid(唯一组合),而轮询计时器只是在rowid>我们在内存中的选择(以获得最新的行添加)。计时器大约每秒运行一次,快速的sql读取器很好地完成了它的工作。到目前为止一切顺利。然而,我觉得这不是最佳的,因为有时由于设计过程而导致数据写入暂停。(用户点击正在写数据的系统上的暂停按钮…)与此同时,我们的计时器继续敲击数据库,没有得到任何新的行。没有错误之类的。这种情况通常是如何处理的?写数据的应用程序与报告应用程序是分开的。这两个应用程序在不同的机器上运行。底线:当数据写入sql server表时,如何在不需要轮询的情况下将数据写入c#应用程序。谢谢

如何同步来自SQL server表的近实时读取

SQL Server具有通知等待应用程序更改的功能,请参见神秘通知。这就是SqlDependency的工作原理。但这只会达到一定的数据变化率阈值。如果您的数据更改太频繁,那么设置查询通知的成本就太高了,因为接收到通知会立即使其失效。对于真正高速率的更改,最好的地方是直接从编写者处通知应用程序,通常通过某种形式的发布-订阅基础设施实现。

您还可以尝试一种混合方法:在显示应用程序中收集更改,仅在没有更改时设置查询通知。这样可以避免在更改速率很高时不断设置查询通知的成本,但是一旦写入稳定下来,您还可以获得非池化的好处。

不幸的是,唯一"合适"的方法是轮询,然而,您可以通过让SQL在循环中等待(确保每个循环通过的等待时间为30ms)直到数据可用(或设置的时间段,例如10s)来减少轮询的成本。这通常在编写SQL伪队列时使用。

您可以使用扩展进程-但这是脆弱的,或者,您可以将消息放入MSMQ。

如果您的报表应用程序运行在单个服务器上,那么您可以让正在向SQL server写入数据的应用程序也向报表应用程序发送消息,让它知道新数据可用

然而,让应用程序连接到服务器以查看是否添加了新记录是最常见的方法。只要在后台线程上进行轮询,就不会影响应用程序的性能。

您需要将事件从数据库推送到您的应用程序领域。

应用程序将需要侦听消息。(你需要决定侦听意味着什么——什么端口,什么协议,什么格式等)

数据库将根据事件通过触发器发送消息。(您需要查找如何在触发器中使用外部应用程序逻辑)