我正在尝试为'long-polling'编写一个PHP脚本,当新行添加到(Postgres)数据库表时返回数据。有没有什么办法让SELECT查询只在返回结果时返回,否则会阻塞?或者我应该在数据库之外使用另一种信号机制?Block SELECT直到结果可用
回答
看一看LISTEN/NOTIFY:
通知命令发送 通知事件先前已 执行的每个客户端 应用在当前 数据库
LISTEN为指定 通知名称名称
http://www.postgresql.org/docs/8.4/static/sql-notify.html
您可以在dd向表格发送“ON INSERT”触发器以触发NOTIFY事件。但是,您将需要另一种机制弄清楚这记录需要选择与NOTIFY事件传递负载的能力将无法使用,直到9.0:
我同意,LISTEN/NOTIFY专门用于此用例 – 2010-08-16 16:00:25
你可以看看LOCK
和FOR UPDATE
。 FOR UPDATE
可以允许查询等待,直到被选中的行被解锁。我不确定是否有超时或有大量资源可能会对资源造成影响,但这是一种可能性。
谢谢,但这并不能解决我的问题,更新可能随时发生(甚至从不),并且没有其他脚本正在运行,直到它发生。 – goffrie 2010-08-13 05:16:00
没有阻塞选择语句。
您可以定期发出select语句 - 这会产生一定的开销。如果查询费用很高,那么您可以编写一个像count(*)这样更便宜的查询,并跟踪可能会返回的新条目,并且如果数字更改会发出更昂贵的查询。
你试图得到一个中断(事件),当你应该考虑轮询。
创建并调用一个存储过程,该存储过程将确定是否存在客户端应该检索的新行。如果这是一个Web应用程序,则定期调用一个Ajax方法,在服务器上,它将查询数据库以查看自上次调用以来是否有新行。如果是这样,运行另一个查询来检索它们并将它们发送回客户端。
我爱Postgres和所有,但如果你想做一些简单的事情,而不是超级企业,或许redis就足够了。我自己使用它取得了很大的成功,并且可以扩展。
- 1. Block select for rich:suggestionBox
- 2. select select into DB的结果
- 3. html/css select option block display
- 4. 显示结果SELECT *
- 5. 级联SELECT *结果
- 6. redis block直到存在密钥
- 7. 限制PostgreSQL SELECT到数字结果ony
- 8. 将SELECT结果合并到一行中
- 9. 分配SELECT结果到字段符号
- 10. MYSQL:从SELECT结果中插入多个结果到表中
- 11. MongoDB锁定,直到找到结果
- 12. MySQL UNION SELECT直到找到?
- 13. 将SELECT语句的结果直观地分组
- 14. 是否可以使用另一个SELECT语句中的SELECT语句的结果?
- 15. Select Query的迭代结果
- 16. SELECT DISTINCT不同于结果
- 17. 从SELECT结果创建varchar
- 18. C:MySQL动态结果集SELECT
- 19. 分页SELECT查询结果
- 20. JModelica可以直接将结果打印到文件吗?
- 21. 遍历结果,直到0 javascript
- 22. 直接链接到Ajax搜索结果
- 23. 使用SELECT结果做出一个表
- 24. 如何在MySQL中使用select结果
- 25. 使用sql的结果select in if
- 26. 有什么方法可以同时存储SELECT结果并输出结果集?
- 27. 对另一个SELECT查询使用knex SELECT查询结果
- 28. 直到结束
- 29. MySQL - 如何将Select Query的结果放到现有的结果中?
- 30. 直方图均衡结果
听起来你后[彗星功能(http://en.wikipedia.org/wiki/Comet_%28programming%29)... – 2010-08-13 00:36:40
是。我正在讨论如何实现后端脚本。 – goffrie 2010-08-13 05:14:40
我的前雇主Truviso做了这件事(它是由Postgres技术构建的)。可悲的是,这不是免费的。 – mikelikespie 2010-08-18 10:18:30