2016-11-18 299 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中通过点减少来实现。