2009-04-15 58 views
1

我有一个读取原始数据并每隔几秒将其写入数据库的进程。最兼容的方式来监听数据库更改?

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

回答

1

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

请记住,您只需要检测数据库写入。如果您需要知道它是什么类型的写入,那么您需要进入事务日志以查看有哪些内容。这绝对是供应商特定的。

0

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

+0

我一直希望有一个非轮询的解决方案,但我不确定是否有一个可以推广的解决方案。 – CookieOfFortune 2009-04-15 21:05:48

0

如果你想成为数据库独立的,轮询可以工作。这不是很有效率或优雅。如果您被诅咒使用不支持触发器的数据库,它也可以工作。过去我们使用的解决方法是使用定时的脚本(例如通过cron)来执行select MAX(primary_key_id) from saidTable。我假设你的主键是一个顺序整数并被索引。

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

此方法还存在其他问题(即:脚本花费太长时间的积压,或并发问题等)。当然,性能也可能成为一个问题!