Promise-MySQL无法将连接释放回池中
我对Node.js开发非常陌生,我正在开发一个应用程序,需要我从mysql数据库中提取用户。 我正在使用promise-mysql
库来查询一个mysql数据库。 我正在尝试使用这样的连接池:
var pool = mysql.createPool({ host: hgh.host, user: hgh.user, password: hgh.pw, database: hgh.name, connectionLimit: 10 });
作为我的模块中的全局variables。
然后我有上面的函数从池中返回一个连接。
function connect() { return pool.getConnection().then(function(connection) { return connection }).catch(function(error) { console.log("Connect failed"); throw ErrorModel.generateErrorObject(error, 500); }); }
下面是我用来查询数据库的function:
function getUser(username) { var sql_query = `SELECT * FROM userstable WHERE userName = ` + `'` + username + `'`; return connect().then(function(conn) { return conn.query(sql_query).then(function(rows) { console.log("HGH getUser Then"); console.log(pool); conn.release(); return rows; }); }).catch(function(error) { console.log("HGH getUser Catch"); console.log(error); throw ErrorModel.generateErrorObject(error, 500); }); }
我得到这个问题:
conn.release
在试图释放当前连接到池中时不是一个函数。 我的逻辑错了吗? 我的目标是build立一个连接池(达到一定的数目),如果用户需要查询, getConnection()
函数就会从池中获取一个空闲的连接,或者创build一个连接。 问题是我不能为我的生活释放它回到游泳池作为free
..每次我用conn.end()
而不是release
连接的请求时,连接仍保留在池的_allConnections
arrays时,我安慰它,在_freeConnections
数组中绝对没有连接。
任何人都知道我可以再次连接自由吗?
看看模块的代码,我发现从池释放连接的function:
pool.prototype.releaseConnection = function releaseConnection(connection) { //Use the underlying connection from the mysql-module here: return this.pool.releaseConnection(connection.connection); };
因此,如果所有这些函数都存在于同一个文件中,则可以在getUser函数中执行以下操作:replace
conn.release();
同
pool.releaseConnection(conn);
看看这个代码, promise-mysql
包装了原始的连接对象,它不公开release
方法。 然而,原始的作为一个属性被称为connection
,所以这个工作:
conn.connection.release();
一些随意的想法:
-
你可能应该逃避你的查询input:
var sql_query = `SELECT * FROM userstable WHERE userName = ${ pool.escape(username) }`;
-
您的代码在发生错误时不会释放连接(因为
.then()
callback中的代码不会被调用); 最好使用.finally()
来执行释放,因为这将被解决和被拒绝的情况:function connect() { var conn = null; return pool.getConnection().then(function(connection) { conn = connection; return connection; }).catch(function(error) { console.log("Connect failed", error); }).finally(function() { if (conn) { conn.connection.release(); } }); }