【问题标题】:Most compatible way to listen for database changes?侦听数据库更改的最兼容方式?
【发布时间】:2009-04-15 20:49:24
【问题描述】:

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

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

【问题讨论】:

    标签: database events triggers listeners


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我希望有一个非轮询解决方案,但不确定是否有一个可以推广的解决方案。
      【解决方案3】:

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

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

      这种方法还有其他问题(即:如果脚本耗时过长,则会出现积压,或者并发问题等)。当然,性能也可能成为问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多