我以这种方式使用连接池:
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();
替换为connection.destroy();
,但效果不佳。
我该如何解决这个问题?
node-mysql版本:
"mysql": "~2.5.1",
顺便说一下。我跟踪创建的连接:
var connCount = 0;
pool.on('connection', function(connection) {
console.log('connCount:', ++connCount);
});
答案 0 :(得分:1)
无论我改变了什么,在我转而使用" express-myconnection"作为中间件(如此处所述:http://teknosains.com/i/simple-crud-nodejs-mysql)。
简而言之:您从request
获得连接,之后不需要释放它,因为中间件会关注它。
所以,我的代码现在(只是重要的部分):
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;
});
}
});
};