最兼容的方式来监听数据库更改?

时间:2009-04-15 20:49:24

标签: database events triggers listeners

我有一个进程可以读取原始数据并每隔几秒就将其写入数据库。

判断数据库是否已写入的最佳方法是什么?我知道Oracle和MS-SQL可以使用触发器或其他东西与其他服务进行通信,但我希望有一种技术可以用于更多类型的SQL数据库(SQL lite,MySQL,PostGRES)。

3 个答案:

答案 0 :(得分:1)

你的问题缺乏一个好答案所需的细节,但我会试一试。触发器适用于目标表,但如果您对系统范围的写入感兴趣,那么您将需要一种更易于维护的更好方法。对于系统范围的写入,我将研究检测事务日志中的更改的方法。不幸的是,每个供应商都以不同方式实现此部分,因此不太可能有一种适用于所有供应商的方法也就是说,在数据库服务器中工作的方法不太可能。但是在OS级别的服务器之外可能有更优雅的方式。例如,如果事务日志是磁盘上的文件,那么检测文件中的更改的某种简单脚本将指示DB已写入。

请记住,您只要求检测db写入。如果您需要知道它是什么类型的写入,那么您将需要进入事务日志以查看其中的内容。这绝对是供应商特定的。

答案 1 :(得分:0)

这取决于你想做什么。如果它是数据库外部需要启动的东西,那么对数据库进行简单的轮询就可以了,否则db特定的触发器可能是最好的。

答案 2 :(得分:0)

如果您希望与数据库无关,则轮询可以正常工作。它不是非常高效或优雅。如果您被诅咒使用不支持触发器的数据库,它也可以工作。我们过去使用的一种解决方法是使用定时(例如通过cron)执行select MAX(primary_key_id) from saidTable的脚本。我假设你的主键是一个连续的整数并被索引。

然后将其与您上次运行脚本时获得的值进行比较。如果匹配,请告诉脚本退出或休眠。如果没有,做你的事。

此方法还存在其他问题(例如:如果脚本耗时太长,或者并发问题等,则会出现积压)。当然,性能也会成为一个问题!