有没有办法通过套接字和socket.io连接到数据库?

时间:2014-09-08 15:21:49

标签: node.js sqlite socket.io

我正在编写一个应用程序,其中一些外部模块/组件每几百毫秒左右用新数据更新一个SQLite数据库,我的工作是编写一个查询该数据的应用程序,并每隔几百毫秒通过套接字广播它同样。

所以目前我正在使用node,express和socket.io做这样的事情:

timer = setInterval(function() {
        db.all('SELECT * FROM cache', function(err, rows) {
            io.emit('data', rows);
        });
    }, 
    400
);

但我觉得应该有一个更直接的方法,我可以直接维护套接字连接到数据库,并监听变化" live"而不是必须进行盲查询(即使数据可能没有改变),也要发射。

也许这不受SQLite的支持(这很好,我认为我在使用的存储系统中有一定的灵活性),但我可能会问这个问题吗?

请注意,我无法控制数据库更新过程,因此我无法发出即将存储在数据库中的数据。整个过程是一个黑盒子C程序,我只能访问数据库本身。

1 个答案:

答案 0 :(得分:1)

您正在寻找的通常称为pub / sub(发布和订阅的简称)。等待数据的客户端连接到服务器,订阅到他们想要接收的事件。数据发起者还连接到此服务器并发布事件。带有Socket.IO给你的事件的RPC与此非常相似。客户端已为某些类型的事件设置处理程序,服务器使用适当的数据触发这些事件。

问题是,pub / sub通常不在数据库中实现。 (Redis是一个例外。)SQLite当然没有这方面的能力。由于您无法修改原始应用程序并且只能访问文件数据库,因此您无能为力。您需要的是有效地使您的服务器成为从轮询数据库到广播消息的适配器。

我确实看到了您的设置问题。首先是您每400毫秒查询一次数据库。不要这样做。如果您的查询需要500毫秒怎么办?现在你有第二个查询堆积。如果这两个查询现在很慢,因为它们都试图同时运行,该怎么办?现在你有3个,4个,5个,然后是100个查询堆积。不要安排下一个查询运行,直到完成一个。请查看implementation of throttle

下一个问题是您每次都盲目地将所有结果发送给客户。我不知道你的应用程序做了什么,但我猜测有可能与之前的查询重叠。您的数据库是否包含带时间戳的列?您可以修改查询以使用它们。或者,修改您的应用程序以过滤它们。