2015-03-31 80 views
0

當發生任何事件時,通過在數據庫中添加條目來更新我的應用程序。 這是通過一個獨立的代碼異步完成的。在等待數據庫更新時使用Websockets或ajax超時?

現在,使用PlayFramework(Java),我想向客戶端顯示以反向時間順序(最新的第一個)列出的事件。

我最初考慮使用前端將連接到的websocket,但這需要服務器每n分鐘查詢一次數據庫以檢查新條目,並在存在的情況下返回它們。

我開始懷疑用setInterval做出一個ajax請求是不是一個更好/更簡單的選擇(同樣的想法:查詢API詢問從最後一個查詢開始的最新事件{時間})。

謝謝你的幫助。

回答

1

我想你最好考慮讓事件驅動,而不是定期考慮性能和架構,如果可能的話。首先要通過使用該DBMS的觸發器(AFAIK,某些DBMS通過觸發器提供執行的Web服務提供執行的Web服務,但我不確定是否需要它)或原始應用程序的偵聽器來通知您的應用程序服務器@PostPersist(如果它在同一個Java進程中,你可以使用一些靜態或DI驅動的監聽器,否則你可以執行HTTP請求)。

現在您正在監聽數據庫的更改,您需要一種方法來通知感興趣的客戶端該更改。您可以選擇任何稱爲WebSocket或Comet的技術來實現這一點。然而,最簡單的選擇是在我看來採用這種用法的框架。正如我是Cettia的作者,我給你一個用Cettia編寫的例子,但是你可以像atmosphere-play這樣的其他項目做類似的工作。

// Assumes you are notified of database changes through this listener 
// However, it doesn't matter 
public class SomeEntityListener { 
    // Assumes you are using Dependency Injection framework like Spring or CDI 
    // so you can inject io.cettia.Server to anywhere you want to handle clients 
    @Inject 
    Server server; 

    // This method is called after persisting of some entity 
    @PostPersist 
    public void postPersist(SomeEntity e) { 
     // Broadcasts just a persisted entity to interested clients 
     // No matter how you are notified of database event, only this line is necessary 
     server.byTag("someentity-subscribers-postpersist", e); 
    } 
} 

關於如何安裝瑟提亞,見this quick start guidea working example for Play。當然,你可以用香草WebSocket做到這一點,但它不是銀彈。 (這就是爲什麼這麼多的框架出現在各種語言和平臺)

0

是的,你的第一選擇是更好,因爲它不需要每n分鐘輪詢,因爲你的應用程序運行在服務器上,可以通過使用某些API將在數據庫更新時觸發。

Websocket將在瀏覽器和播放應用程序之間創建一個包含2個頻道的頻道,一個用於入站,另一個用於出站。在創建WebSocket的後臺播放應用程序中,我們可以將一個事件監聽器附加到入站通道,該入站通道將根據瀏覽器端的入站通道中收到的數據觸發回調。

因此,我們可以創建一個API,該API將在更新時從數據庫觸發,該API將在websocket的出站通道上寫入數據。

使用此方法將幫助您刪除對數據庫的大量輪詢。