2016-11-18 297 views
0

我有用於讀取和更新數據的Web服務,並使用Spring,Spring JDBC進行數據庫訪問。我的控制器可以通過桌面,手機等多種渠道訪問。如果使用桌面更新數據,則應立即在手機中反映。目前的方法是不斷調用服務來獲取更新的數據。我覺得這是最糟糕的做法,並導致數據庫性能問題。使用Spring避免數據庫輪詢的最佳方法

是否有一種可能的方式,GET服務僅在有其他通道更新數據庫而不是連續輪詢時調用?什麼是最好的方法和如何實現它?

+0

數據庫數據可以僅由桌面/移動客戶端更新,或者也可以有一些後端進程更改數據? – Insac

回答

1

連續調用服務似乎是一個非常糟糕的主意。我想你需要一個數據庫觸發器,當行插入/更新/刪除時觸發。它可以將某些東西發佈到Web服務或將某些東西放在Message Queue上。

祝你好運。

+0

我正在尋找一些使用Spring的實現/方法。謝謝 – user2968937

+0

Web服務可以是Spring。您可以使用Spring Integration或JmsTemplate來處理Message Queue。在沒有使用數據庫來觸發更改事件的情況下,沒有好辦法做你想做的事情。 –

1

我能想到這個問題的架構答案。在彈簧控制器和數據庫之間使用消息傳遞解決方案。逸岸你將需要兩個隊列

  • EventSink的隊列 - 發佈所有從任何渠道,這queue.The用戶的始發將是服務管理又名dbservice數據庫更新數據的變更請求。

  • EventBroadcast隊列 - 將更改後的數據發佈數據庫更新發布到此隊列。理想情況下,dbservice應該在與db更新相同的事務中處理此發佈。所有頻道都可以訂閱此隊列以接收更新。

    的優點來考慮這種做法將涉及

  • 優點 - 這種方法不涉及數據庫服務,使性能和去耦從數據庫的變化。

  • 缺點 - 複雜性增加

0

不斷輪詢不是那麼糟糕,因爲你可能想象。將消息推送給客戶端而不需要他們發出請求需要web-sockets或類似的來實現這一點。如果它不是來自服務器的大量休憩,而且不是太頻繁,例如數百萬和數百萬的請求,那麼我現在就離開它。

但是,如果這是一個大量的帶寬,我們正在談論它,那麼你不會希望被投票。您可能需要查看訂閱者類型模式,客戶端會在發生特定事件時訂閱通知。發生此事件時,服務器將向客戶端發送消息。

檢測此事件不應要求輪詢數據庫。對數據庫的修改應該觸發事件。如果你遇到這種情況,你可以在Spring中通過點減少來實現。