【问题标题】:What's the best way for the client app to immediately react to an update in the database?客户端应用程序立即对数据库中的更新做出反应的最佳方式是什么?
【发布时间】:2009-02-25 17:37:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 哇,很多人似乎都在回应主题标题,但并未真正阅读问题。它不是触发器的人!如果我今天还有任何选票,我会投反对票给他们一个教训,让他们在回答之前阅读该死的问题。
  • 嗯,这有点苛刻。这个问题几乎是在问魔法。如果他想立即做出反应,那么触发过程中可能会涉及到触发因素。
  • @Dana:期望人们在尝试回答之前阅读问题并不苛刻。不,他几乎没有要求魔术,他使用真实的工作示例(gmail)作为模型。不,可能不会涉及触发器。
  • 标题很差。触发器是标题所提出问题的正确答案。此外,在编辑发生之前,触发器仍然是“如何在一般情况下使用数据库执行此操作”的答案。删除对数据库的引用可能会有所帮助。
  • 其实我同意这个标题很糟糕,但我确实想知道如何对数据库中的数据变化做出特别的反应,但关键是在客户端应用程序中对它们做出反应。我会看看我能不能想出一个更好的标题来捕捉这个。

标签: database ajax triggers rfc


【解决方案1】:

这里基本上有两个问题:

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

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

对于问题 #1

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

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

对于问题 #2

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

另一种可能的方法是,如果数据库有 an interface 来创建链接到动态库(即 DLL 或 .so 文件)的存储过程或触发器。然后您可以在C or whatever 中编写服务器信令代码。

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

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

【讨论】:

  • 这正是我想要的。谢谢!
  • 不知道为什么,服务器推送很少被很好地利用。
【解决方案2】:

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

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

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

只要我的两分钱。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 请看我上面的编辑,据我所知,触发器不能满足我的要求。
    • 重新编辑:这对我来说似乎很疯狂,因为 gmail 有大量客户端,让所有客户端一直轮询服务器似乎效率很低。一定有更好的方法......但感谢你的洞察力,我没想到它实际上是这样完成的。
    • 替代方案“服务器推送”是 1994 年左右将彻底改变 Web 的新事物,它涉及为每个客户端保持实时 TCP 连接,这是一个指数级的糟糕想法。
    • 我记得 1994 年左右使用服务器推送的 Netscape FishCam。非常令人兴奋。
    【解决方案4】:

    不幸的是,无法将数据推送到网络浏览器 - 您只能将数据作为对请求的响应发送 - 这正是 HTTP 的工作方式。

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

    【讨论】:

    • 对于带有数据库后端的普通桌面应用程序来说呢?有没有办法将数据从数据库推送到应用程序?也许某种类型的连接保持打开状态?
    • 实际上并非如此。服务器推送确实有效。这只是一个非常糟糕的主意。
    • 谢谢混乱 - 我没有意识到这一点。我猜是因为这是个坏主意,我什至从未听说过! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多