【发布时间】:2008-10-03 14:51:28
【问题描述】:
除了每隔 n 次或类似的时间从表中进行选择之外,还有更好的方法来观察表中的新条目吗?
我有一个外部程序经常更新的表,并且客户端可以在新数据到达时观察它,我怎样才能做到这一点而无需设置固定周期的可重复选择语句?
【问题讨论】:
除了每隔 n 次或类似的时间从表中进行选择之外,还有更好的方法来观察表中的新条目吗?
我有一个外部程序经常更新的表,并且客户端可以在新数据到达时观察它,我怎样才能做到这一点而无需设置固定周期的可重复选择语句?
【问题讨论】:
另一种类似的方法是添加
add column Last_Modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP
到每个表并为您的选择查询添加前缀,以将上次请求日期/时间与最大值(Last_Modified)进行比较。
数据库通常是pull 源而不是push,因此无论如何您仍然需要以编程方式探测更改。
【讨论】:
在 MySQL 中,没有比轮询更好的方法(您创建一个特定的表来简化轮询),在其他数据库中,您可以使用对数据库外部产生影响的触发器。在 MySQL 中,triggers 只能在数据库内部做一些事情(例如,填充帮助表)。
【讨论】:
这是我的工作: 我为表设置了一些触发器(插入、删除、更新),这些触发器增加了另一个表中的计数器。我的数据库访问代码保留一个本地计数器并将其与返回值进行比较,最终将一个布尔值发送回调用者,回答 IsDataCurrent() 问题。
我们使用此数据库访问代码的程序会根据请求轮询或检查它,然后进行适当的调用以使自己保持最新状态。
我相信还有其他方法可以解决这个问题。不过,它对我来说效果很好。
【讨论】:
如果您可以控制主机,可能触发数据库外的行为。
一) This question's answer suggests 使用 'select 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 托管的应用程序,所以很遗憾,这些选项都不适合我。)
【讨论】:
这只是对您的方法的一个小改进。在您正在监视的表上编写触发器以更新 Last_Changed 表。
【讨论】: