节点js setInterval和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.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 }); 

它一直运行良好,但最近我已经开始在networking应用程序中发现错误,说“用户已经有超过'max_user_connections'活动连接”,并通过使用MySQL的“show processlist”在数据库级调查,我看到迅速产卵/正在死亡的连接 – 所有我需要做的是杀死/重新启动pushNotifications.js脚本,一切恢复正常。

我所希望的是有人看到我的代码有问题,可能无法处理可能导致进程反复产卵的时间间隔比每隔15秒更频繁的场景。 欣赏任何想法,因为我没有想法进一步诊断。

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

创build一个体积适中的连接池一次,并使用连接来更好:

 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); }); 

一些补充说明:

  • 一旦客户端断开连接,其关联间隔不会被清除/停止。 在某一时刻,这将开始导致问题,因为它代表了一个不在那里的客户端运行查询; 您可能应该使用disconnect事件的侦听器,以便在服务器检测到客户端断开连接时调用clearInterval来清理资源。
  • 您的示例代码不显示数据库查询是否特定于每个客户端。 如果不是,则应该将间隔完全io.on()块之外,然后使用Socket.IO广播向所有连接客户端发送数据(而不是分别为每个客户端运行完全相同的查询)