2009-02-25 13 views
10

對數據庫中的數據更新進行即時響應編程的最佳方法是什麼?客戶端應用程序立即對數據庫中的更新做出反應的最佳方式是什麼?

我能想到的最簡單的方法就是一個線程,它檢查數據庫中某些數據的特定更改,並持續等待再次檢查一段預定義的時間長度。這個解決方案似乎對我來說是浪費和不理想的,所以我想知道是否有更好的方法。

我認爲必須有某種方式,畢竟像gmail這樣的web應用程序似乎能夠在收到新電子郵件後立即更新我的收件箱。當然,我的客戶不會一直在檢查更新。我認爲他們這樣做的方式是使用AJAX,但AJAX如何表現得像一個我不知道的遠程函數調用。我很想知道gmail如何做到這一點,但我最想知道的是如何在一般情況下使用數據庫來做到這一點。

編輯: 請注意我想立即對客戶端代碼中的更新作出反應,而不是在數據庫本身中,所以據我所知,觸發器無法做到這一點。基本上我想讓用戶得到一個通知,或者在數據庫發生變化後更新屏幕。

+0

哇很多人似乎都在迴應主題標題,而沒有真正閱讀問題。它不是一個觸發器人!如果我今天有剩餘選票,我會投票給他們,讓他們在回答之前給他們上一堂課,閱讀該死的問題。 – 2009-02-25 17:57:09

+0

那麼這有點苛刻。這個問題只是要求魔術。如果他想立即做出反應,那麼觸發器可能會涉及到這個過程中的某個地方。 – Dana 2009-02-25 18:01:19

+0

@Dana:在嘗試回答之前,不要期望人們閱讀問題並不難。不,他幾乎不問魔術,他使用真正的工作示例(gmail)作爲模型。不,觸發器可能不會涉及。 – 2009-02-25 18:31:25

回答

7

你基本上這裏有兩個問題:

  1. 你想瀏覽器能夠接收來自Web應用程序服務器的異步事件,而輪詢在緊密循環。

  2. 您希望Web應用程序能夠接收來自數據庫的異步事件,而無需在緊密循環中輪詢。

對於問題#1

見的技術,我認爲你的類型,這些維基百科的鏈接尋找:

編輯:2009年3月19日 - 剛剛遇到ReverseHTTP這可能是問題#1的興趣。

對於問題2

該解決方案將是特定於您所使用的數據庫,也可能是數據庫驅動程序服務器使用了。例如,對於PostgreSQL,您可以使用LISTENNOTIFY。 (並且冒着被低估的風險,您可能會使用數據庫觸發器在更改表數據時調用NOTIFY命令。)

另一種可能的方法是如果數據庫有an interface來創建存儲過程或觸發器鏈接到動態庫(即,DLL或.so文件)。然後,您可以在C or whatever中編寫服務器信令代碼。

在同一主題上,某些數據庫允許您使用諸如Java, RubyPythonothers之類的語言編寫存儲過程。對於信號機制,您可能可以使用其中的一種(而不是像C那樣編譯爲機器代碼DLL的東西)。

希望能給你足夠的想法來開始。

1

那麼,最好的方式是數據庫trigger。取決於您未指定的DBMS支持它們的能力。

重新編輯:像Gmail這樣的應用程序實際上是通過AJAX輪詢實現的。安裝Tamper Data Firefox擴展程序以查看它的實際運行情況。這裏的訣竅是在「無新聞」的情況下保持你的輪詢查詢盲目快速。

6

我想一定是有辦法,之後 所有,如Gmail Web應用程序似乎 來更新我的收件箱幾乎立即 後,新的電子郵件被髮送給我。 當然,我的客戶並不是始終在檢查更新,而是始終在 之間。我想 認爲他們這樣做的方式是與 AJAX,但AJAX如何可以表現得像一個 遠程函數調用我不知道。我想 很想知道Gmail如何做 這個,但我最想知道的 是如何在一般情況下使用數據庫做到這一點 。

有時用wireshark偷看...有一些谷歌流量經常出現在那裏,它似乎。

根據您的數據庫,觸發器可能會有所幫助。我寫的一個應用程序依賴於觸發器,但我使用輪詢機制來實際「知道」某些事情已經改變。除非您可以將更改通知數據庫,否則一些輪詢機制是必要的,我會說。

只是我的兩分錢。

1

不幸的是,無法將數據推送到Web瀏覽器 - 您只能將數據作爲對請求的響應發送 - 這只是HTTP工作的方式。

儘管您想使用AJAX,但每秒調用一次Web服務並不過分,只要您設計Web服務以確保接收少量數據,發送少量數據並且可以運行非常迅速地產生這種反應。

相關問題