轮询数据库更改:SqlDependency,SignalR是好的

如果我需要通过sql依赖项和signalr在db中显示更改数据,那将是很好的。 假设我的交易表经常被很多人改变。 假设在几秒内数据是多次改变然后我想知道通知将如何进入sql依赖类?

更改数据是否会在sql依赖类之前排队? 当巨大的流量没有进行更改时,sql依赖类可以处理数据更改吗?

在这里,我正在阅读有关SqlDependency和SignalR的文章。 该链接是http://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency

我不清楚几件事情。

  1. 如何为IIS提供订阅查询通知权限?
  2. 请参阅本文中的行。

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) { JobHub.Show(); } 

当数据发生变化时, dependency_OnChange事件将触发并且JobHub.Show(); 正在打电话

 JobHub is name of class and not static class so i like to know how anyone can call `JobHub.Show();` from out side ?? 
  1. 什么是GlobalHost类以及何时使用它?
  2. 文章代码相关问题。 只是去这个链接

Database Change Notifications in ASP.NET using SignalR and SqlDependency

查看视图中的jquery代码,获取数据并填充表。 第一次当页面加载时假设表中存在5条记录,那么5条记录将被传递给jquery代码,它将只显示那5条记录,但是当表中的任何现有数据发生变化时,会发生什么?

唯一更改的行将到达客户端或包括已更改数据的所有数据将到达客户端?

如果你说只有改变的数据将编码,那么只需看到该链接中的video。 它显示在video数据中逐个更改,更改反映在客户端,但如果您看到jquery代码,它只是先清空表并再次构建表。 所以我的问题是,如果数据发生变化,只有变更数据会出现,那么一行应该显示在客户端….我是对的。 但在video中,变化显示以及其他数据也是如此。

所以请好好阅读链接文章,然后回答我的问题。 谢谢

请指导我。 谢谢

好吧,ManniAT很接近,但不是很明显,这里发生的事情是SQLDependency通知事件是一次性的交易。 所以当他指出它会第一次开火。 您需要删除该处理程序(这可以防止在您对方法进行后续调用时出现多种情况)并重新添加它以便再次触发。 如果您不想直接从SQLDependency设置方法返回数据,(我建议您不要这样做)您可以在需要重新建立监听器时调用此方法。

答案:1)一旦通知触发,您就会调用Hub上的方法来刷新已更改的数据。 SqlDependency Notifications应尽可能具体,当它触发时,您应该已经知道UI的哪个部分需要更新。

2)您没有将Hub设置为静态类,因此在调用show方法之前没有先实例化类的实例就不能调用类上的方法,在示例中我认为它是静态类,所以这就是为什么有用。 将集线器设置为静态类并不是我在这种情况下建议的,我会创建一个单独的集线器跟踪类,就像在这个例子中一样。 http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-server-broadcast-with-signalr-20

3)在这种情况下GlobalHost文件我相信是你的Global.asax,你启动和停止你的SqlDependencies。

修改示例:

 try { using ( var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) { connection.Open(); using (SqlCommand command = new SqlCommand(@"SELECT [Id] ,[FName] ,[LName] ,[DOB] ,[Notes] ,[PendingReview] FROM [dbo].[Users]", connection)) { // Make sure the command object does not already have // a notification object associated with it. command.Notification = null; SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); if (connection.State == ConnectionState.Closed) connection.Open(); command.ExecuteReader(); } } } catch (Exception e) { throw; } } private void dependency_OnChange(object sender, SqlNotificationEventArgs e) { SqlDependency dependency = sender as SqlDependency; if (dependency != null) dependency.OnChange -= dependency_OnChange; //Recall your SQLDependency setup method here. SetupDependency(); JobHub.Show(); } 

我希望这可以帮助你! 如果您还有其他问题,请告诉我。

SQL更改通知适用于“查询返回的已更改数据”。 这意味着 – 如果您查询ID = 3的作业 – 只有对此记录的更改才会触发通知。

这里有很好的解释: SqlDependency OnChange Not Firing

问题是 – 在示例中,如果表中的“任何”记录发生变化,应用程序希望得到通知。 这项工作到目前为止 – 并且(在答案中第1点上方的链接中)事件触发ONCE。

要再次重新触发此操作,您必须再次提交查询。 这是示例所做的 – 它再次获取所有数据。

一个可能的解决方案(实现您的要求)是:

A.通过调用来获取数据来触发请求 – 您不必在客户端上显示结果 – 只需执行查询。

B.事件触发时 – 再次进行查询 – (不将数据发送到客户端)

C.您可以使用其他(额外)查询来查明发生的事情,或者只使用B的结果

D.)用signalR发送信息

要获得更改,您必须找到比较数据的方法,因为SQL Server提供的唯一信息是“发生了什么事”(以及什么) – 但不是哪些记录受到影响。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlnotificationinfo(v=vs.110).aspx

样本的另一个问题(我只是猜测)是,如果你有多个客户端正在监听 – 每个客户端将再次“重新触发” – 这可能(我不确定)在很多订阅事件中。

所以下次它会多次触发 – 导致多个请求……

所以要扩展上面的示例你应该(除上述步骤之外):

1.)更改GetData,如果已经订阅,则不会再次重新触发

2.)提供一个额外的function,通知客户有关更改 – 某种“客户看到”标志 – 更改清除此标志(触发器) – 通知清除它

3.)更改您可以轻松找到已更改记录的数据库架构 – 如果您将显示已删除的内容,则需要一些额外的表来保存已删除的记录

另一种方法(不使用SQLChangeNotifications)将CLR代码保存在数据库中。 此代码可以调用通知客户端的集线器。 但是这样的解决方案取决于几个因素。

a。)可以在SQL Server中运行signalR客户端

b。)您的策略是否允许DB服务器与Web服务器通信

c。)您的策略是否允许SQL CLR集成

如)….

第二种方法对我来说更容易,因为您可以从SQL CLR触发器触发发送。 这使您可以在没有“额外列”和“删除元素”表的情况下发送更改的数据。