2008-10-03 105 views
15

有没有更好的方式来监视表中的新条目,除了从中选择每n个时间或类似的东西呢?观察MySQL的变化表?

我有一个表,一个外部程序经常更新,客户端可以观看这个新的数据,因为它到达,我怎么能做出,而不必设置重复的select语句的一个固定的时间?

回答

7

在MySQL中还有比轮询(您创建一个特定的表,虽然简化了查询),其他数据库可以拥有对数据库外部的冲击触发器没有最好的方式。在MySQL中,triggers只能在数据库本身内部完成任务(例如,填充辅助表)。

-3

如果你知道SQL足够了...你可以写触发器和报警。

+0

可以触发调度到数据库之外吗?我不记得他们这样做,你能解释一下吗? – 2008-10-03 14:56:17

+0

对于mysql不要这么认为。 – itsmatt 2008-10-03 14:57:25

6

这是我做的: 我已经为表(插入,删除,更新)设置了一些触发器,这些触发器在另一个表中增加了一个计数器。我的数据库访问代码保留一个本地计数器并将其与返回的值进行比较,最终将一个bool返回给调用者,回答问题IsDataCurrent()。

我们的程序,使用该数据库访问代码,通过民意调查或检查的请求,然后做出相应的呼叫保持自己处于最新状态。

我敢肯定还有其他的方法来解决这个问题。尽管如此,它对我来说还算不错。

1

这只是对您的方法的小改进。在你正在观察的桌子上写一个触发器来更新Last_Changed表。

6

另一个类似的方法是

add column Last_Modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

添加到每个表并序SELECT查询到的最后一个请求的日期/时间与最大值(LAST_MODIFIED)进行比较。

数据库通常来源,而不是所以你仍然需要以编程方式探测的变化不管是什么。

-4

nodejs + websockets将做的伎俩!

6

这是可能触发数据库外的行为,如果你有控制主机。

A) This question's answer suggests写入使用“选择INTO OUTFILE”与一些系统进程监视更改该文件(例如的inotify为基础的方法,如node-inotify甚至Grunt-watch可能就够)

B中的文件)勇敢: The answer to this question指出,如果你可以安装C/C++附加到数据库服务器,你可以使用一个用户定义函数(UDF)来调用sys_exec(),从而触发外部进程,或可能写的实际进程直接在UDF中。

http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html#qandaitem-B-5-1-11

(我研究这个的时刻,对于AWS RDS托管应用程序,这样既不幸的是这些选项都适合我。)