10

对数据库中的数据更新立即做出反应的最佳方式是什么?

我能想到的最简单的方法是一个线程,它检查数据库中某些数据的特定更改,并在某个预定义的时间长度内不断等待再次检查它。这个解决方案对我来说似乎是浪费和次优的,所以我想知道是否有更好的方法。

我想肯定有某种方法,毕竟像 gmail 这样的网络应用程序似乎能够在向我发送新电子邮件后几乎立即更新我的收件箱。当然,我的客户并不是一直在不断检查更新。我认为他们这样做的方式是使用 AJAX,但是我不知道 AJAX 如何表现得像一个远程函数调用。我很想知道gmail是如何做到这一点的,但我最想知道的是如何在一般情况下使用数据库来做到这一点。

编辑:请注意我想立即对客户端代码中的更新做出反应,而不是在数据库本身中,所以据我所知触发器不能这样做。基本上我希望用户在数据库发生更改后收到通知或更新他的屏幕。

4

4 回答 4

7

您在这里基本上有两个问题:

  1. 您希望浏览器能够从 Web 应用程序服务器接收异步事件,而无需在紧密循环中进行轮询。

  2. 您希望 Web 应用程序能够从数据库接收异步事件,而无需在紧密循环中进行轮询。

对于问题 #1

请参阅这些维基百科链接,了解我认为您正在寻找的技术类型:

编辑:2009 年 3 月 19 日 - 刚刚遇到ReverseHTTP,这可能对问题 #1 感兴趣。

对于问题 #2

该解决方案将特定于您正在使用的数据库,并且可能还针对您的服务器使用的数据库驱动程序。例如,对于PostgreSQL ,您将使用LISTENNOTIFY。(并且冒着被否决的风险,您可能会使用数据库触发器在更改表数据时调用 NOTIFY 命令。)

另一种可能的方法是,如果数据库有一个接口来创建链接到动态库(即,DLL 或.so 文件)的存储过程或触发器。然后你可以用C 或其他语言编写服务器信号代码。

在同一主题上,一些数据库允许您使用Java 、RubyPython等语言编写存储过程。您可能可以使用其中之一(而不是像 C 那样编译为机器代码 DLL 的东西)作为信号机制。

希望这能给你足够的想法来开始。

于 2009-02-26T01:39:07.617 回答
6

我想肯定有某种方式,毕竟像 gmail 这样的网络应用程序似乎在向我发送新电子邮件后几乎立即更新我的收件箱。当然,我的客户并不是一直在不断检查更新。我认为他们这样做的方式是使用 AJAX,但是我不知道 AJAX 如何表现得像一个远程函数调用。我很想知道gmail是如何做到这一点的,但我最想知道的是如何在一般情况下使用数据库来做到这一点。

找个时间看一下wireshark……似乎那里经常有一些谷歌流量。

根据您的数据库,触发器可能会有所帮助。我编写的一个应用程序依赖于触发器,但我使用轮询机制来真正“知道”某些事情发生了变化。我会说,除非您可以将更改从数据库中传达出来,否则某些轮询机制是必要的。

只是我的两分钱。

于 2009-02-25T17:47:38.280 回答
1

好吧,最好的方法是数据库触发器。取决于您未指定的 DBMS 支持它们的能力。

重新编辑:Gmail 等应用程序的做法实际上是使用 AJAX 轮询。安装Tamper Data Firefox 扩展以查看它的运行情况。诀窍是在“没有消息”的情况下保持您的投票查询速度极快。

于 2009-02-25T17:39:49.577 回答
1

不幸的是,没有办法将数据推送到 Web 浏览器——你只能发送数据作为对请求的响应——这正是 HTTP 的工作方式。

不过 AJAX 是您想要使用的:每秒调用一次 Web 服务并不过分,只要您设计 Web 服务以确保它接收少量数据、发送回少量数据并且可以非常快速地运行以生成那个回应。

于 2009-02-25T18:01:30.663 回答