【问题标题】:Block SELECT until results available阻止 SELECT 直到结果可用
【发布时间】:2010-08-13 00:05:12
【问题描述】:

我正在尝试为“长轮询”编写一个 PHP 脚本,在将新行添加到 (Postgres) 数据库表时返回数据。有没有办法让 SELECT 查询仅在返回结果时返回,否则阻塞?或者我应该在数据库之外使用另一种信号机制吗?

【问题讨论】:

  • 听起来你在追Comet functionality...
  • 是的。我说的是如何实现后端脚本。
  • 我的前雇主 Truviso 正是这样做的(它基于 Postgres 技术)。遗憾的是,它不是免费的。

标签: php sql postgresql


【解决方案1】:

看看 LISTEN/NOTIFY:

NOTIFY 命令发送一个 给每个客户端的通知事件 以前的应用程序 为指定的执行 LISTEN 名称 当前通知名称 数据库

http://www.postgresql.org/docs/8.4/static/sql-notify.html

您可以向表中添加“ON INSERT”触发器来触发 NOTIFY 事件。但是,您将需要另一种机制来确定需要选择哪些记录,因为在 9.0 之前将无法使用带有 NOTIFY 事件的负载交付能力:

http://www.postgresql.org/docs/9.0/static/sql-notify.html

【讨论】:

  • 我同意,LISTEN/NOTIFY 正是针对这个用例而设计的
【解决方案2】:

没有阻塞选择语句。

您可以定期发出 select 语句 - 这会产生一定的开销。如果查询很昂贵,那么您可能会编写一个更便宜的查询,例如 count(*) 并跟踪可能返回的新条目,如果数字发生变化,则发出更昂贵的查询。

【讨论】:

    【解决方案3】:

    您可以查看LOCKFOR UPDATEFOR UPDATE 可以允许查询等待直到正在选择的行被解锁。我不确定是否存在超时或大量此类资源会产生什么影响,但这是一种可能性。

    【讨论】:

    • 谢谢,但这并不能解决我的问题,更新可能随时(或永远不会)发生,并且在此之前没有其他脚本正在运行。
    【解决方案4】:

    当您可能应该考虑轮询时,您正试图获得一个中断(事件)。

    创建并调用一个存储过程,该过程将确定客户端是否应该检索新行。如果这是一个 Web 应用程序,请定期调用 Ajax 方法,该方法在服务器上将查询数据库以查看自上次调用以来是否有新行。如果是这样,请运行另一个查询来检索它们并将它们发送回客户端。

    【讨论】:

      【解决方案5】:

      我喜欢 postgres,但如果你想做一些简单而不是超级企业的事情,也许 redis 对你来说就足够了。我自己使用它取得了很大的成功,而且它可以扩展。

      http://code.google.com/p/redis/

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多