Node.js 节点mysql不';不要重复使用连接
我以以下方式使用连接池:Node.js 节点mysql不';不要重复使用连接,node.js,node-mysql,Node.js,Node Mysql,我以以下方式使用连接池: var pool = mysql.createPool({ host: config.db.host, port: config.db.port, user: config.db.user, password: config.db.password, database: config.db.database, connectionLimit: config.db.connectionLimit }); exports.api_point = f
var pool = mysql.createPool({
host: config.db.host,
port: config.db.port,
user: config.db.user,
password: config.db.password,
database: config.db.database,
connectionLimit: config.db.connectionLimit
});
exports.api_point = function(req, res) {
pool.getConnection(function(err, connection) {
if (err) {
console.error('error acquiring connection', err);
var result = {};
result.error = err.code;
res.json(result);
return;
} else {
var query = connection.query('SELECT * FROM tableName', function(err, rows) {
connection.release();
var result = {};
if (err) {
console.error('error executing query: ' + err.stack);
result.error = err.message;
} else {
result.data = rows;
}
res.json(result);
return;
});
}
});
};
问题:
但是,在创建了所有连接(由connectionLimit定义,例如20)之后,对pool.getConnection()
的下一个调用将挂起,直到Express返回:“GET/api_point--ms--”(大约10秒后)
我已尝试替换connection.release()代码>与连接。销毁()代码>无效。
我怎样才能解决这个问题
节点mysql版本:
"mysql": "~2.5.1",
顺便说一句,我跟踪正在创建的连接:
var connCount = 0;
pool.on('connection', function(connection) {
console.log('connCount:', ++connCount);
});
无论我做了什么更改,在我切换到使用“ExpressMyConnection”作为中间件(如下所述)之前,一切似乎都不起作用
简而言之:您可以从请求中获得连接,之后无需释放它,因为中间件关心这一点
因此,我的代码现在是(仅重要部分):
app.js:
var myconnection = require('express-myconnection');
var mysql = require('mysql');
app.use(
myconnection(mysql, {
host: config.db.host,
port: config.db.port,
user: config.db.user,
password: config.db.password,
database: config.db.database,
connectionLimit: config.db.connectionLimit
}, 'request')
);
api.js:
exports.api_point = function(req, res) {
req.getConnection(function(err, connection) {
if (err) {
console.error('error acquiring connection', err);
var result = {};
result.error = err.code;
res.json(result);
return;
} else {
var query = connection.query('SELECT * FROM tableName', function(err, rows) {
var result = {};
if (err) {
console.error('error executing query: ' + err.stack);
result.error = err.message;
} else {
result.data = rows;
}
res.json(result);
return;
});
}
});
};
只需要connection.release()即可。如果您试图在释放前一个连接之前请求一个新连接,则将建立一个新连接,否则,它将重用已释放的连接。你确定你不仅仅是发送请求太快了吗?如果您同时发送21个请求,则第21个请求将挂起。@KevinB,这就是文档所说的和我所做的。既然这不起作用,那就是我为什么在这里寻求帮助…Np。在我启动另一个请求之前,请求完成(并返回响应)。您能显示该代码吗?困扰我的是,在第20次请求之后,getConnection并没有无限期地挂起。如果它停止“挂起”,那么很明显,您在上一个请求完成之前发送了它,并且它们在某个时候会被释放。我通过jquery.ajax(从web应用程序)访问此api,因此只有当我在网页/日志上看到上一个请求的响应时,我才会启动另一个请求。