【发布时间】:2009-04-15 20:49:24
【问题描述】:
我有一个进程每隔几秒读取原始数据并将其写入数据库。
判断数据库是否已写入的最佳方法是什么?我知道 Oracle 和 MS-SQL 可以使用触发器或其他东西与其他服务进行通信,但我希望有一种技术可以与更多类型的 SQL 数据库(SQL lite、MySQL、PostGRES)一起使用。
【问题讨论】:
标签: database events triggers listeners
我有一个进程每隔几秒读取原始数据并将其写入数据库。
判断数据库是否已写入的最佳方法是什么?我知道 Oracle 和 MS-SQL 可以使用触发器或其他东西与其他服务进行通信,但我希望有一种技术可以与更多类型的 SQL 数据库(SQL lite、MySQL、PostGRES)一起使用。
【问题讨论】:
标签: database events triggers listeners
您的问题缺少一个好的答案所需的细节,但我会试一试。触发器非常适合定位表,但如果您对系统范围的写入感兴趣,那么您将需要一种更易于维护的更好方法。对于系统范围的写入,我会研究检测事务日志中更改的方法。不幸的是,每个供应商都以不同的方式实现这部分,因此不太可能采用一种适用于所有供应商的方法。也就是说,在数据库服务器中工作的方法是不可能的。但是在操作系统级别的服务器之外可能有更优雅的方式。例如,如果事务日志是磁盘上的文件,那么检测文件更改的某种简单脚本将指示数据库已写入。
请记住,您只要求检测数据库写入。如果您需要知道它是什么类型的写入,那么您需要进入事务日志以查看其中的内容。这肯定是特定于供应商的。
【讨论】:
这取决于你想做什么。如果它是需要启动的数据库外部的东西,那么对数据库进行简单的轮询就可以了,否则最好使用数据库特定的触发器。
【讨论】:
如果你想独立于数据库,轮询可以工作。它不是很有效或优雅。如果您被诅咒使用不支持触发器的数据库,它也可以工作。我们过去使用的一种解决方法是使用定时脚本(比如通过 cron)来执行select MAX(primary_key_id) from saidTable。我假设你的主键是一个连续的整数并且被索引。
然后将其与您上次运行脚本时获得的值进行比较。如果它们匹配,则告诉脚本退出或休眠。如果没有,做你的事。
这种方法还有其他问题(即:如果脚本耗时过长,则会出现积压,或者并发问题等)。当然,性能也可能成为问题!
【讨论】: