gpt4 book ai didi

javascript - 如何为每个 Web 套接字仅使用一个数据库连接?

转载 作者:行者123 更新时间:2023-11-28 20:11:56 24 4
gpt4 key购买 nike

我在 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);

因此,每十秒就会调用一次 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 最终达到最大容量并且所有 future 的查询都会超时。我正在使用模块 msnodesql 执行 SQL 数据库任务,但 API 中似乎没有 close() 函数来关闭现有连接。我想我需要创建一个全局连接,然后让所有新套接字引用该连接,以便进行长轮询。然而,考虑到 Express.js/node.js 的异步特性,我不确定如何设置全局连接(如果可能的话)。

最佳答案

目前,您正在为发送的每个查询创建一个新的 SQL 连接。相反,您说过希望每个 socket.io 连接有一个 SQL 连接。每当收到 updates 请求时就创建 SQL 连接(假设每个 socket.io 连接仅收到一次此消息):

socket.on('updates', function(PEMSID){
var sql = require('msnodesql');

// open a new socket for each `updates` message
sql.open(connStr, function(err,conn){
if(err) { return console.error("Could not connect to sql: ", err); }

// when the connection is made, start the interval
setInterval(function(){

// each interval, get_gps, and pass `conn` as an argument
gps_helper.get_gps(conn, PEMSID, function(data){ //query GPS table for marker coordinates
socket.emit('message', {message: data});
});
}, 10000);
});
});

然后您的 get_gps 函数将接受 conn 参数:

exports.get_gps = function(conn, PEMSID, callback) {
var connStr = "Driver={SQL Server Native Client 11.0};Server=myHost,1433;Database=myDB;UID=Username;PWD=Password;";
var mQuery = "EXEC Z_CoordsByPEMS '" + PEMSID + "'";

// no need to open `conn`; it's already made
conn.query(mQuery,function(err,results){
if (err)
return console.error("Error running query: ", err);
callback(results); //return query results
});
}

如果您需要一个全局 SQL 连接,只需将 sql.open 调用移至更高的位置即可:

// create conn outside of the socket.io message callback
sql.open(connStr, function(err,conn){
if(err) { return console.error("Could not connect to sql: ", err); }

io.sockets.on("connection", function(socket) {

socket.on('updates', function(PEMSID){
setInterval(function(){
gps_helper.get_gps(conn, PEMSID, function(data){ //query GPS table for marker coordinates
socket.emit('message', {message: data});
});
}, 10000);
});

});
});

关于javascript - 如何为每个 Web 套接字仅使用一个数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19790322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com