我正在使用ASP.NET / C#和MSSQL 08创建好友列表。简单的数据列表,列出了我的朋友的个人资料图片和名称。
在名称旁边,我有一个标签显示我朋友的当前状态。例如,Online,Offile,Away等。
我的问题是,如何在没有定时器一直调用数据库询问当前状态的情况下如何更改此标签的值?
我想让数据库(sql server 2008)告诉我何时发生更改并告诉我的业务逻辑更新状态标签。
这可能吗?
谢谢!
答案 0 :(得分:2)
要完成你正在寻找的东西..这就是我要做的,就是创建一个基于表的视图,只包含完成任务所需的项目。例如,UserID | Online_Status ..然后使用AJAX,拨打电话。它对用户来说太小了,他们甚至都不会注意到带宽的使用/处理......等......等等。
这几乎就是你所说的你不想要的,但即使你有100万用户和空间,他们相距3-5分钟..你应该没关系,考虑到需要几毫秒来执行检查。
只是我的两分钱..
答案 1 :(得分:2)
我认为你不应该这样做。有一些技术可以使用comet执行此操作,但它会从您的服务器中消耗大量资源,从而明显减少可以访问您的网站/应用的用户数量。问题是服务器和客户端需要打开一个套接字,服务器才能将数据推送到客户端。
我要做的是让客户询问是否有任何更新,将有效负载保持在最低限度。如果服务器说有更改的数据,则客户端会发出另一个请求来获取该数据。
答案 2 :(得分:1)
您可以使用SqlDependency
类在数据库查询结果发生更改时收到通知。
关于SqlDependency
课程的MSDN有一篇很好的文章。
要在ASP.Net上下文中使用SqlDependency
类,请考虑以下MIX 2011视频中解释的策略。
希望,这有帮助。
答案 3 :(得分:0)
目前给出的所有选项都是有效的,这就是大多数网站今天所做的选择;但是,OP要求采用某种推送通知机制而不是拉动,我认为对于那种事情,websockets是这样做的。
答案 4 :(得分:0)
我相信这是SqlCacheDependency
的目的。如果您使用的是SQL Server 2005或更高版本*,它会从SQL Server到您的应用程序实现推送通知模型,以通知您数据集发生更改的时间。因此,每次缓存无效时,您都可以获取最新数据,但在此之前,它只是从您的缓存数据集中读取并保存到数据库的行程。它的文档是here。
正如评论中所述,这不是SQL Server的核心设计,我不知道这个解决方案实际效率如何。如果我正确理解您的问题,您将需要一个缓存依赖性PER USER,使用此解决方案很可能完全不可扩展。你应该为自己开发,测试,测量和找出,而不是第二次猜测什么是最有效的解决方案。每种情况都会有所不同,没有“正确的方法”。
*在Sql Server 2000和7中,它使用了拉模型。