[英]Best approach for avoiding database polling using Spring
我有用於讀取和更新數據並使用spring,spring JDBC進行數據庫訪問的Web服務。 我的控制器可以通過許多渠道訪問,例如台式機,移動設備等。如果使用台式機更新數據,則應該立即在移動設備中反映出來。 當前的方法是不斷調用服務以獲取更新的數據。 我認為這是最糟糕的方法,並且也會導致數據庫性能問題。
有沒有一種可能的方式,使得僅當通過其他通道進行數據庫更新而不是連續輪詢時才調用GET服務? 最佳方法是什么?如何實施?
連續調用該服務似乎是個壞主意。 我認為您需要一個數據庫觸發器,當插入/更新/刪除行時將觸發該觸發器。 它可以將某些內容發布到Web服務或將某些內容放入消息隊列中。
祝好運。
我可以想到一個對該問題的體系結構答案。 在spring控制器和數據庫之間使用消息傳遞解決方案。 實際上,您將需要兩個隊列
EventSink隊列-將來自任何通道的所有數據更改請求發布到此隊列。訂戶將是管理數據庫更新(即dbservice)的服務。
EventBroadcast隊列-將數據庫更新后的更改數據發布到此隊列。 理想情況下,dbservice應該在與db update相同的事務中處理此發布。 所有通道都可以訂閱此隊列以接收更新。
考慮這種方法的優點將涉及
優點-這種方法不涉及任何數據庫服務,因此性能和與數據庫更改的脫鈎都沒有。
缺點-復雜性增加
連續輪詢並不像您想象的那樣糟糕。 在沒有請求的情況下將消息推送給客戶端需要Web套接字等來實現。 如果它不是服務器中的重要部件,並且使用頻率不是很高(如數以百萬計的請求中那樣),那么我將暫時保留它。
但是,如果這是大量帶寬,我們正在談論,那么您就不想進行輪詢。 您可能希望查看訂戶類型模式,在發生特定事件時,客戶端將通過該模式訂閱客戶端的通知。 發生此事件時,服務器將向客戶端發送一條消息。
檢測到此事件不需要輪詢數據庫。 對數據庫的修改應觸發事件。 如果您喜歡這種事情,可以在Spring中使用切入點來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.