Node.js 有没有办法通过sockets和socket.io连接到数据库?

Node.js 有没有办法通过sockets和socket.io连接到数据库?,node.js,sqlite,socket.io,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)

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

因此,目前我正在使用node、express和socket.io执行类似的操作:

timer = setInterval(function() {
        db.all('SELECT * FROM cache', function(err, rows) {
            io.emit('data', rows);
        });
    }, 
    400
);
但我觉得应该有一种更直接的方法来实现这一点,通过这种方法,我可以直接维护到数据库的套接字连接,并“实时”侦听更改,而不必进行盲目查询(即使数据可能没有更改)并发出

也许SQLite不支持这一点(这很好,我认为我正在使用的存储系统具有一定的灵活性),但我所要求的可能吗


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

您要查找的通常称为pub/sub(publish and subscribe的缩写)。等待数据的客户端连接到服务器并订阅他们想要接收的事件类型。数据发起人还连接到此服务器并发布事件。Socket.IO提供的带有事件的RPC与此非常相似。客户机为某些类型的事件设置了处理程序,服务器使用适当的数据触发这些事件

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

我确实看到你的设置有问题。第一个是每400毫秒查询一次数据库。不要那样做。如果查询需要500毫秒怎么办?现在您有了第二个问题。如果这两个查询现在很慢,因为它们都试图同时运行,该怎么办?现在有3个、4个、5个,然后是100个查询。在完成一个查询之前,不要计划运行下一个查询。检查一个关于这个的文件


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

您的浏览器可以使用浏览器端ODBC驱动程序连接到WebSocket到TCP网桥(注意:我不知道是否存在,但您可以从节点移植一个;除了任何其他环境更改外,您肯定需要使用WebSocket而不是TCP)。WS-to-TCP网桥(例如)将是一个长期运行的服务器进程,用于接受WebSocket连接并通过原始TCP将数据转发到主机(这里是您的数据库)。也就是说,让数据库主动报告更新有点棘手;看见