如何为每个 Web 套接字仅使用一个数据库连接
How to use only one DB connection per web socket?
我在我的 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 最终达到最大容量并且所有未来的查询都会超时。我正在使用模块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中连接一个动态变量名
- 如何检查monodb数据库连接
- 使用 node.js 设置 Microsoft Access 数据库连接
- 从另一个选择框并使用数据库连接填充选择框
- HTML网站中的数据库连接方式,应该在chrome和Firefox中支持
- Nodejs 实现数据库连接 (mysql) 的最佳方式
- 英特尔 XDK 将 mySQL 数据库连接到应用程序
- 使用节点单元编写带有数据库连接/驱动程序的单元测试
- 将标题标签与数据库连接并使其自动刷新,就像在Facebook标题中一样
- 如何为每个 Web 套接字仅使用一个数据库连接
- 在 AngularJS 中使用数据库 - 我应该在哪里编写数据库连接代码
- 如何在节点.js中关闭数据库连接
- 使用 JScript 在 global.asa 中创建数据库连接
- 如何捕获数据库连接状态或 ping 连接
- 如何在 Javascript 中编写数据库连接
- Ajax 调用返回“找不到类”错误,即使已定义数据库连接也是如此
- 不能连接一个 ajax 中的 javascript 变量,而另一个 ajax 内部的 javascript 变量
- 导出 MONGO 数据库连接到模型.js文件
- 流星在数据库连接后运行一个函数
- 如何在node js中跨不同文件共享一个数据库连接