如何在ASP.NET中实现实时更新

时间:2010-02-27 15:11:02

标签: asp.net ajax

我看过几个网站向您展示数据库中正在发生的事情的实时更新。一个例子可能是

  • 实时显示股票价格的股票代码网站
  • 显示“其他用户当前正在搜索的内容......”等数据。

我认为这将涉及某种轮询机制,每隔几秒查询一次数据库并在网页上呈现它。但是当我从绩效的角度考虑时,这个想法让我害怕。

在我正在处理的应用程序中,我需要显示用户已提交的操作的实时状态。用户等待该过程完成。当操作完成时,状态由另一个进程(可以是Windows服务)更新。我应该每秒查询一次数据库以获得更新状态吗?

3 个答案:

答案 0 :(得分:0)

不一定在db中完成。正如你所说的那样昂贵。尽管db可能是一个后备存储,但是可能会使用一种更有效的机制来配合轮询操作,例如将实时状态存储在内存中以及最终在db上。您可以比表中的 SELECT状态每秒更有效地轮询内存。

正如我在评论中提到的那样,在某些情况下,您可以通过动画伪造状态更新的外观来获得很多好处,例如,使用估算,更少检查数据源。

修改

(优化实时使用较少的数据库资源)

不是每个用户轮询数据库以每隔X秒检查一次作业状态,而是稍微改变一下情况的行为。每次将作业添加到数据库时,请读取数据库一次,以将有关所有作业的元数据放入缓存中。因此,例如,内存缓存将反映[user49 ... user3,user2,user1,userCurrent] 50个用户的作业(如果每个作业1个)。 (也许我应该把它写成[job49 ... job2,job1,job_current]但同样的想法)

然后,个人用户的网页将轮询始终保持最新的缓存。在此示例中,db仅在缓存中读取50次(每个作业提交一次)。如果这50个用户平均等待1分钟进行作业处理并每秒轮询一次状态,则用户群总共轮询缓存50个用户x 60秒= 3000次。

在50分钟的时间内,这是50次数据库读取而不是3000次。(平均每分钟一次。)缓存始终是新鲜的,但处理负载。它比考虑每个用户每秒点击数据库要小得多。您可以在缓存中存储其他统计信息和信息,以帮助进行估算等。只要新缓存提供更高的效率,它就是大规模数据库命中的可行替代方案。

注意:通过缓存,我指的是像Application或第三方解决方案这样的全局存储,而不是快速超出范围的ASP.NET页面缓存。使用ASP.NET机制进行缓存可能不适合您的情况。

另一个注意事项:db将知道何时附加另一个作业记录,无论从哪里开始,因此触发器可以初始化缓存更新。

尽管有一个很好的数据库解决方案,但很多用户经常轮询可能会产生Web服务器连接问题,并且您可能需要在该级别使用不同的解决方案,具体取决于流量。

答案 1 :(得分:0)

也许有一个缓存并使用它,所以每次修改数据时都不会访问数据库,每隔几秒或几分钟或者你喜欢的内容更新数据库

答案 2 :(得分:0)

问题涉及Web应用程序的许多层。

在客户端上,您可以使用iframe,其内容每隔n秒使用元刷新标记(HTML)自动刷新,或使用由计时器触发并更新命名div(AJAX)的javascript。

在服务器上,您至少有两个位置可以缓存数据:

一个在Application对象中,您可以在其中保留上次更新的时间戳,并在刷新间隔过去时刷新缓存的数据。

如果要显示数据库中的数据,请保留聚合值或缓存相关数据以便更快地检索。