2009-04-15 57 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。我假設你的主鍵是一個順序整數並被索引。

然後將其與您上次運行腳本時獲得的值進行比較。如果它們匹配,則告訴腳本退出或睡眠。如果沒有,請做你的事情。

此方法還存在其他問題(即:腳本花費太長時間的積壓,或併發問題等)。當然,性能也可能成爲一個問題!