使用Spring避免数据库轮询的最佳方法

时间:2016-11-18 14:04:59

标签: java database spring spring-mvc spring-jdbc

我有用于读取和更新数据的Web服务,并使用spring,spring JDBC进行数据库访问。我的控制器可以通过桌面,移动等多种渠道访问。如果使用桌面更新数据,则应立即反映在移动设备中。当前的方法是不断调用服务以获取更新的数据。我觉得这是最糟糕的方法并导致数据库性能问题。

是否有可能只有在通过其他渠道进行数据库更新而不是连续轮询时才调用GET服务?什么是最好的方法以及如何实现它?

3 个答案:

答案 0 :(得分:1)

持续调用该服务似乎是一个非常糟糕的主意。我认为您需要一个数据库触发器,在插入/更新/删除行时触发。它可以将某些内容发布到Web服务或将某些内容放在Message Queue上。

祝你好运。

答案 1 :(得分:1)

我可以想到这个问题的架构答案。在spring控制器和数据库之间使用消息传递解决方案。事实上,你需要两个队列

  • EventSink队列 - 将源自任何通道的所有数据更改请求发布到此队列。订阅者将是管理数据库更新(即dbservice)的服务。

  • EventBroadcast队列 - 将db update后更改的数据发布到此队列。理想情况下,dbservice应在与db update相同的事务中处理此发布。所有通道都可以订阅此队列以接收更新。

    考虑这种方法的优点将涉及

  • 优点 - 这种方法不涉及数据库服务,因此性能和数据库更改的解耦都是如此。

  • 缺点 - 复杂性增加

答案 2 :(得分:0)

连续投票并不像你想象的那么糟糕。在没有他们发出请求的情况下将消息推送给客户端需要Web套接字或其他类似的功能来实现此目的。如果它不是来自服务器的大型休息,而且不是太频繁,就像数以百万计的请求那样,那么我现在就把它留下来。

如果这是一个大量的带宽,我们正在谈论它,那么你不会想要进行轮询。您可能希望查看订阅者类型模式,客户端将订阅在特定事件发生时收到通知。发生此事件时,服务器将向客户端发送消息。

检测此事件不应该要求轮询数据库。对数据库的修改应该触发事件。如果你遇到这种情况,你可以在Spring中使用切入点来做到这一点。