在等待数据库更新时使用Websockets或ajax超时?

时间:2015-03-31 13:48:46

标签: ajax playframework websocket

通过在数据库中添加条目,在发生任何事件时更新我的​​应用程序。 这是通过独立代码异步完成的。

现在,使用PlayFramework(Java),我想向客户显示按逆时间顺序(最新的第一个)列出的事件。

我最初考虑使用前端连接到的websocket,但这需要服务器每n分钟查询一次数据库以检查新条目,如果它们存在则返回它们。

我开始怀疑用setInterval制作ajax请求是不是更好/更简单的选择(考虑到同样的想法:查询api以询问最新事件从date = {last query time}开始。)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为您最好考虑将其设为事件驱动,而不是在可能的情况下考虑性能和架构进行定期查询。第一件事是通过使用DBMS的触发器(AFAIK,某些DBMS通过触发器提供执行的Web服务但是我不确定是否需要)来基于Play of changes of database通知您的应用程序服务器。或原始应用程序的监听器如@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);
    }
}

有关如何安装Cettia的信息,请参阅this quick start guidea working example for Play。当然,你可以用vanilla WebSocket做到这一点,但它不是银弹。 (这就是为什么这么多框架出现在各种语言和平台中的原因)

答案 1 :(得分:0)

是的,您的第一选择更好,因为它不需要每n分钟轮询一次,因为您的应用程序在服务器上运行,可以使用在更新数据库时触发的某些API进行通知。

Websocket将在浏览器和播放应用程序之间创建一个通道,该通道包含2个通道,一个用于入站,一个用于出站。在创建websocket时在播放应用程序的后端,我们可以将事件监听器附加到入站通道,这将触发回调,具体取决于来自浏览器端的入站通道中收到的数据。

因此我们可以创建一个在更新时从数据库触发的API,该API将在websocket的出站通道上写入数据。

使用此方法可帮助您删除对数据库的大量轮询。