Javascript Node.js错误:EADDRINUSE,地址已在使用中

Javascript Node.js错误:EADDRINUSE,地址已在使用中,javascript,node.js,Javascript,Node.js,出于测试目的,我设置了这个小脚本: Client = require('mysql').Client, client = new Client(); client.user = 'root'; client.password = 'root'; client.port = 8889; counter = 0; data = ''; setInterval(update, 10); function update(){ counter++; request(); } var sys

出于测试目的,我设置了这个小脚本:

Client = require('mysql').Client, client = new Client(); 
client.user = 'root'; client.password = 'root'; client.port = 8889;

counter = 0; data = '';
setInterval(update, 10);

function update(){
    counter++; request();
}
var sys = require('sys'), fs = require('fs'), http = require('http'),
    url = require('url'),port = 8001;

http.createServer(function(request, response) {
    response.writeHead(200, {
        'Content-Type': 'text/html'
    }); response.end('Hello world');
}).listen(port);

function request(){
    client.connect();
    client.query('USE db');
    client.query(
    'SELECT * FROM table', function selectCb(err, results, fields) {
        if (err) { throw err; }
        if(results.length > 0)
        {
            var firstResult = results[0];
            data = firstResult['data'];
        }
        client.end();
    }
    );
}
node.js:180
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use
它工作正常,但大约一小时后,服务器崩溃并输出以下错误:

Client = require('mysql').Client, client = new Client(); 
client.user = 'root'; client.password = 'root'; client.port = 8889;

counter = 0; data = '';
setInterval(update, 10);

function update(){
    counter++; request();
}
var sys = require('sys'), fs = require('fs'), http = require('http'),
    url = require('url'),port = 8001;

http.createServer(function(request, response) {
    response.writeHead(200, {
        'Content-Type': 'text/html'
    }); response.end('Hello world');
}).listen(port);

function request(){
    client.connect();
    client.query('USE db');
    client.query(
    'SELECT * FROM table', function selectCb(err, results, fields) {
        if (err) { throw err; }
        if(results.length > 0)
        {
            var firstResult = results[0];
            data = firstResult['data'];
        }
        client.end();
    }
    );
}
node.js:180
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use

更新


我更新了代码。它现在包括一些mysql这肯定是造成问题的原因,尽管我不知道确切原因。不考虑这一部分可以稳定循环。此外,我将时间间隔更新为每10毫秒一次(服务器在几分钟后崩溃,其中包含mysql部分,但在没有连接的情况下继续运行)

您每10毫秒连接一次,这会给mysql服务器带来沉重的负载。我不知道怎么可能出现“address in use”错误,但您可能希望尝试连接一次并使用连接执行查询


就像你不需要在messenger应用程序中为你想发送给某人的每封邮件一次又一次地注销和重新登录一样:)

你真的应该尊重pimvb关于每秒不连接100次数据库的评论。如果node mysql没有正确或立即清理连接,则很可能会在一小时内耗尽可用的连接端口(实际上大约10分钟左右,使用
netstat | grep WAIT | wc-l
查看有多少已关闭的连接处于挂起状态)

另外,您应该了解JavaScript/node.js的异步特性。当其他查询仍处于挂起状态时,您可能不希望在如此紧密的循环中运行新查询。这只会堆积起来,SQL server将阻塞

更新

类似于下面的内容可以防止您阻塞服务器。它将发出尽可能多的请求,但每10毫秒不超过1个。免责声明:在so文本框中被黑客攻击,未经测试


在另一个端口上监听怎么样?@pimvdb-这会有什么不同吗?就我个人而言,我使用了像
15382
这样的随机端口,到目前为止还没有出现错误,所以可能值得一试。我正在尝试我们所说的,但出于好奇,这会有什么不同呢?也许您希望尝试连接一次,并在不断开连接的情况下每10毫秒执行一次查询。每秒连接100次听起来不是一个好主意。关于大量的查询,你是对的。我正在尝试一些节点的东西,这只是一个实验。这不仅仅是因为它们很多,而是由于node.js和异步IO的性质,您有可能(实际上,如果表中有一个大数据集),在上一个查询完成之前发出下一个查询。这里可能就是这种情况,这也解释了可用端口用尽的原因:在一个小时后~65000个查询(以及65000个打开的连接)堆积起来,因为查询和连接的频率超过了SQL server的处理能力。TL;DR:在调用上一个查询的回调之前,不要再次查询您的sql server,在end()的回调(您甚至不使用)被激发之前,不要连接回sql server。我如何防止这种情况发生?看起来不错。谢谢你的见解!这肯定有助于理解节点。强大的东西。事实上,我相信单凭这一点可能无法解决问题。仔细观察节点进程和sql server进程。我预测它们中的任何一个或两者的内存使用量都会不断增长,直到它们中的任何一个崩溃。