我在我的 Express.js Web 应用程序中使用 socket.io 为正在侦听调用 SQL 查询的事件的客户端打开套接字。服务器套接字如下所示:
socket.on('updates', function(PEMSID){
setInterval(function(){
gps_helper.get_gps(PEMSID, function(data){ //query GPS table for marker coordinates
socket.emit('message', {message: data});
});
}, 10000);
因此,每隔 10 秒get_gps()
就会调用一次函数进行长轮询,以检查是否有任何新记录已添加到表中。该get_gps()
函数如下所示:
exports.get_gps = function(PEMSID, callback) {
var sql = require('msnodesql');
var connStr = "Driver={SQL Server Native Client 11.0};Server=myHost,1433;Database=myDB;UID=Username;PWD=Password;";
var mQuery = "EXEC Z_CoordsByPEMS '" + PEMSID + "'";
sql.open(connStr, function(err,conn){
if(err)
return console.error("Could not connect to sql: ", err);
conn.query(mQuery,function(err,results){
if (err)
return console.error("Error running query: ", err);
callback(results); //return query results
});
});
}
我遇到的问题是get_gps()
每次轮询任何更新时都会打开与 SQL 数据库的新连接。这显然会在托管数据库的服务器上造成疯狂的开销并且需要更改,因为服务器的 CPU 最终会达到最大容量并且所有未来的查询都会超时。我正在使用该模块msnodesql
来执行 SQL db 任务,但似乎close()
API 中没有关闭现有连接的函数。我想我需要创建一个全局连接,然后让所有新的套接字引用它,以便进行长轮询。但是,鉴于 Express.js/node.js 的异步特性,我不确定如何设置全局连接,如果可能的话。