2010-08-13 25 views
4

我正在尝试为'long-polling'编写一个PHP脚本,当新行添加到(Postgres)数据库表时返回数据。有没有什么办法让SELECT查询只在返回结果时返回,否则会阻塞?或者我应该在数据库之外使用另一种信号机制?Block SELECT直到结果可用

+2

听起来你后[彗星功能(http://en.wikipedia.org/wiki/Comet_%28programming%29)... – 2010-08-13 00:36:40

+0

是。我正在讨论如何实现后端脚本。 – goffrie 2010-08-13 05:14:40

+0

我的前雇主Truviso做了这件事(它是由Postgres技术构建的)。可悲的是,这不是免费的。 – mikelikespie 2010-08-18 10:18:30

回答

4

看一看LISTEN/NOTIFY:

通知命令发送 通知事件先前已 执行的每个客户端 应用在当前 数据库

LISTEN为指定 通知名称名称

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

您可以在dd向表格发送“ON INSERT”触发器以触发NOTIFY事件。但是,您将需要另一种机制弄清楚记录需要选择与NOTIFY事件传递负载的能力将无法使用,直到9.0:

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

+0

我同意,LISTEN/NOTIFY专门用于此用例 – 2010-08-16 16:00:25

0

你可以看看LOCKFOR UPDATEFOR UPDATE可以允许查询等待,直到被选中的行被解锁。我不确定是否有超时或有大量资源可能会对资源造成影响,但这是一种可能性。

+0

谢谢,但这并不能解决我的问题,更新可能随时发生(甚至从不),并且没有其他脚本正在运行,直到它发生。 – goffrie 2010-08-13 05:16:00

2

没有阻塞选择语句。

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

0

你试图得到一个中断(事件),当你应该考虑轮询。

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

0

我爱Postgres和所有,但如果你想做一些简单的事情,而不是超级企业,或许redis就足够了。我自己使用它取得了很大的成功,并且可以扩展。

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