gpt4 book ai didi

javascript - Node.js 错误 : EADDRINUSE, 地址已被使用

转载 作者:搜寻专家 更新时间:2023-10-31 23:39:32 25 4
gpt4 key购买 nike

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

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 部分,但没有继续运行)

最佳答案

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

此外,您应该了解 JavaScript/node.js 的异步特性。您可能不希望在其他查询仍在挂起时在如此紧密的循环中运行新查询。这只会堆积起来,SQL 服务器会窒息。

更新

像下面这样的东西应该可以防止你阻塞你的服务器。它将发出尽可能多的请求,但每 10 毫秒不超过 1 个。 免责声明:在 so 文本框中被黑,未经测试!

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

counter = 0; data = '';

client.connect(function {
setInterval(update, 10);

var queryPending = false, queryReIssue = false;

function update(){
if (queryPending) {
queryReIssue = true;
} else {
request();
}
counter++;
}
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(){
requestPending = true;
client.query('USE db');
client.query('SELECT * FROM table', function selectCb(err, results, fields) {
requestPending = false;
if (err) { console.log('ERROR: ' + err.message) }
if(results.length > 0) {
var firstResult = results[0];
data = firstResult['data'];
}
if (queryReIssue) {
queryReIssue = false;
request();
}
});
}
});

关于javascript - Node.js 错误 : EADDRINUSE, 地址已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6759079/

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