Javascript 使用节点js setInterval和nohup处理生成问题

Javascript 使用节点js setInterval和nohup处理生成问题,javascript,mysql,node.js,nohup,Javascript,Mysql,Node.js,Nohup,我正在运行node.js脚本,每15秒向所有连接的web应用程序用户广播一次数据。它正在用这个命令运行 nohup node /pushNotifications.js & 这是代码 var https = require('https'), fs = require('fs'), app = require("express"), key = fs.readFileSync('apache.key', 'utf8'), cert = fs.readFileSync('apache.

我正在运行node.js脚本,每15秒向所有连接的web应用程序用户广播一次数据。它正在用这个命令运行

nohup node /pushNotifications.js &
这是代码

var https = require('https'), fs = require('fs'), app = require("express"), key = fs.readFileSync('apache.key', 'utf8'), cert  = fs.readFileSync('apache.crt', 'utf8')
var server = https.createServer({key: key, cert: cert}, app); 

server.listen(8080)
var io = require("socket.io").listen(server);
var mysql = require('mysql');

function handler (req, res) {
}

io.on('connection', function (socket) {

  setInterval( function() {

    var connection = mysql.createConnection({
      host: 'db.server.com', user: 'dbuser', password: 'dbpass', database: 'dbname', port: 3306
    });

    connection.connect(function(err){
    });

    connection.query('SELECT someColumn FROM someTable ', function(err, rows, fields) {
      if (!err) {
        socket.emit('notifications', JSON.stringify(rows));
        connection.end();
      } else {
        connection.end(); 
      }
    }); 

  }, 15000); //15 seconds

}); 
它总是工作得很好,但最近我开始在web应用程序中发现错误,说“用户已经有超过‘max_User_connections’的活动连接”,并在数据库级别使用MySQL的“show processlist”进行调查,我看到了快速繁殖/死亡的连接——我所需要做的就是杀死/重新启动pushNotifications.js脚本,一切都恢复正常


我希望有人看到我的代码有问题,可能无法处理可能导致进程以比每15秒更规则的间隔重复生成的场景。感谢您的任何想法,因为我不知道如何进一步诊断此问题。

您正在为每个客户端连接和每个间隔创建一个新的数据库连接,这相当浪费

最好创建一个大小合适的连接,并使用以下连接:

let pool  = mysql.createPool({
  connectionLimit : 10, // this may require tweaking depending on # of clients
  ...
});

io.on('connection', function(socket) {
  setInterval(function() {
    pool.query('SELECT someColumn FROM someTable ', function(err, rows, fields) {
      if (!err) {
        socket.emit('notifications', JSON.stringify(rows));
        connection.end();
      } else {
        connection.end(); 
      }
    }); 
  }, 15000);
});
一些补充意见:

  • 一旦客户端断开连接,其关联的间隔就不会被清除/停止。在某种程度上,这将开始导致问题,因为它代表不再存在的客户机运行查询;当服务器检测到客户端断开连接时,您可能应该使用事件的侦听器来调用
    clearInterval
    ,以清理资源
  • 您的示例代码没有显示数据库查询是否针对每个客户机。如果不是,则应将间隔完全移动到
    io.on()
    块之外,并使用Socket.io广播向所有连接客户端发送数据(而不是分别为每个客户端运行完全相同的查询)

非常感谢您提出了一些很棒的想法-我将实施这些想法,看看这是否会阻止这种行为-至少它们更有效,因此绝对值得添加!