2012-08-28 84 views
4

客户的要求是,只要数据库中的某个特定表发生任何类型的更改,就能够在屏幕上看到刷新的数据。c#用SQL依赖于IIS的长轮询不一致

我们在DB中有一个Job表,其内容显示在浏览器的GridView中。要求在任何更新,删除或插入在Jobs表中发生时刷新网格数据。

我们已经使用SQL依赖关系&长轮询技术来实现这一点。 SQL依赖关系将通知asp.net数据库中的任何更改,而长时间轮询将使gridview保持异步更新。

我们在IIS 7.0中部署了这个功能,并注意到不一致的行为,即大部分时间都会刷新gridview,比如说90-95%,但有些时候刷新并不会发生,尽管DB表中的数据发生了变化。

有没有人遇到过这个问题?在IIS中是否需要特定的配置?我曾经在很少的地方看过IIS没有针对彗星编程进行扩展。上述情况发生在只有一个用户的测试环境中。任何帮助将不胜感激。提前致谢。

编辑:这个问题似乎也发生在ASP.Net开发服务器上,并且不会与IIS隔离。记录消息后,我们发现SQLDependency是OnChange事件不会一致触发的事件。

编辑2:当我运行查询select * from sys.dm_qn_subscriptions我得到相同的通知订阅的几行,即重复的订阅。只有id列是不同的。这可能是一个原因吗?如果是,为什么我会得到重复的订阅行?我怎样才能杀死ASP.NET的订阅?

+0

不知道我是否正确理解您的设置。为什么你需要使用SQL依赖*和*长轮询?如果您使用SQL依赖关系,则根本不需要查询数据库,您的应用程序将在数据库更改时得到通知。 – James

+0

您是否尝试过记录所有记录所有更改事件以查看是否存在未触发更改的特定情况? – linkerro

+2

在失败的时代,你是否设法确定哪个部分坏了?它是'SqlDependency'吗?还是被长时间投票选中?没有这些知识,这是一个不可能的问题。 *就个人而言*,我会更多地倾向于web-sockets和redis-pub/sub ......但我想这取决于您的扩展需求。 –

回答

0

你需要做的第一件事就是一个很好的例子检查dbo.AspNet_SqlCacheTablesForChangeNotification表。那里有每个表的缓存失效计数器。 如果数字没问题(100%增量没有损失),请考虑检查UI层。

+0

我没有在我们的数据库中看到此表。是否因为我们没有使用SQLCacheDependency? – StewieHere

+0

是的。要启用SQL缓存依赖性,您应该使用aspnet_regsql实用程序。首先为数据库启用此功能,然后再为所需的所有表启用此功能。你可以在http://www.codeproject.com/Articles/14976/ASP-NET-Caching-Dependencies中阅读更多关于它的内容。 – Femel