Javascript 节点连接超时
我的node.js应用程序由于随机时间的连接超时而提供5xx。以下是我连接和查询的方式:Javascript 节点连接超时,javascript,mysql,node.js,amazon-rds,node-mysql,Javascript,Mysql,Node.js,Amazon Rds,Node Mysql,我的node.js应用程序由于随机时间的连接超时而提供5xx。以下是我连接和查询的方式: var mysql = require('mysql'); var config = { host: '172.10.1.1', port: 3306, user: 'user', password: 'pwd', database: 'mydb', conne
var mysql = require('mysql');
var config = {
host: '172.10.1.1',
port: 3306,
user: 'user',
password: 'pwd',
database: 'mydb',
connectionLimit: 15,
queueLimit: 30
}
var poolCluster = mysql.createPool(config);
var queryDB = function(query, cb) {
poolCluster.getConnection(function(err, connection) {
if(err) {
cb(err, null);
}
else {
connection.query(query, function (err, rows) {
connection.release();
cb(err, rows);
});
}
});
};
另外,在另一个备用版本中,在禁用连接池的情况下,代码如下所示:
queryDB = function(query, cb) {
var connection = mysql.createConnection(config);
connection.query(query, function(err, rows) {
connection.end();
cb(err, rows);
});
};
但这两种设置都给出了答案
错误:连接ETIMEDOUT
在连接时。\u handleConnectTimeout
此处可以看到与我当前设置类似的项目:
如果您能指出连接可能出现的问题,那就太好了。谢谢
更新
由于node.js服务是在集群模式下运行的,所以我认为可能是线程之间的竞争条件导致了从共享连接池获取mysql连接资源。因此,我将群集模式关闭为单线程模式,连接超时停止。
我仍然不相信是比赛条件导致了这个问题。有没有办法验证这一点?如果经常发生这种情况,默认的acquireTimeout有点低(10000ms),因此如果有多个连接正在运行,您应该增加它。您可以使用在连接选项中进行设置
acquireTimeout: 1000000
var config = {
host: '172.10.1.1',
port: 3306,
user: 'user',
password: 'pwd',
database: 'mydb',
connectionLimit: 15,
queueLimit: 30,
acquireTimeout: 1000000
}
这与超时无关。我注意到以下几点(如果您在AWS Lambda函数中使用它,我认为这也适用于许多回调情况) 您正在调用
连接.end()
在它实际将COM_QUIT数据包发送到MySQL服务器以关闭连接之前。因此,下次您只需导入var mysql=require('mysql')
(至少在我的情况下)它会抛出一个超时错误,因为之前的连接似乎对您的机器仍然打开,但实际上已经被MySQL关闭
请看
因此,要解决此问题,请使用.destroy()
而不是.end()
其他明智的做法是在回调中正确使用.end()
,如下所示:
connection.query(query, function(err, rows)
{
connection.end(function(errCon) //Don't do anything with end Error
{
// The connection is terminated now
cb(err, rows);
});
});
在执行以下代码时,我还遇到了连接超时错误
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
port:"3307",
user: "root",
password: "root",
database:"nodedb"
});
/*
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
*/
module.exports=con;
我删除了con.connect()方法来解决此问题。现在很好用 每个查询平均需要多长时间?@schtever:时间非常少。。大约几毫秒Shello,因为我有一个类似的问题,它是否也与CPU问题增加有关?我想知道为什么它会经常发生!一定有什么原因吗?好问题,github上对此进行了较长时间的讨论,但没有给出真正的答案。我想这可能是由于网络延迟或其他原因@失控的我正在使用带有5000个连接池的节点mysql,由于我增加了超时时间,所以没有遇到这个问题。然后我就不再试图找到答案,为什么…哈哈!顺便问一下,您是在node.js中使用集群模式还是仅使用单线程模式?PS:我已经更新了参考资料中的问题。整个应用程序都是集群的,但没有使用pool clustering@haywireThank,这正是我在使用AWS Lambda时遇到的问题。MariaDB的本地实例也有同样的问题。”conn.end()'会起作用。删除con.connect会阻止mysql尝试连接到mysql服务器,因此它当然会防止出现问题。
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
port:"3307",
user: "root",
password: "root",
database:"nodedb"
});
/*
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
*/
module.exports=con;