2015-03-31 79 views
0

当发生任何事件时,通过在数据库中添加条目来更新我的应用程序。 这是通过一个独立的代码异步完成的。在等待数据库更新时使用Websockets或ajax超时?

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

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

我开始怀疑用setInterval做出一个ajax请求是不是一个更好/更简单的选择(同样的想法:查询API询问从最后一个查询开始的最新事件{时间})。

谢谢你的帮助。

回答

1

我想你最好考虑让事件驱动,而不是定期考虑性能和架构,如果可能的话。首先要通过使用该DBMS的触发器(AFAIK,某些DBMS通过触发器提供执行的Web服务提供执行的Web服务,但我不确定是否需要它)或原始应用程序的侦听器来通知您的应用程序服务器@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); 
    } 
} 

关于如何安装瑟提亚,见this quick start guidea working example for Play。当然,你可以用香草WebSocket做到这一点,但它不是银弹。 (这就是为什么这么多的框架出现在各种语言和平台)

0

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

Websocket将在浏览器和播放应用程序之间创建一个包含2个频道的频道,一个用于入站,另一个用于出站。在创建WebSocket的后台播放应用程序中,我们可以将一个事件监听器附加到入站通道,该入站通道将根据浏览器端的入站通道中收到的数据触发回调。

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

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