我是Node.js开发的新手,我正在研究一个需要我从mysql数据库中提取用户的应用程序。我正在使用promise-mysql
库来查询mysql数据库。我试图使用这样的连接池:
var pool = mysql.createPool({
host: hgh.host,
user: hgh.user,
password: hgh.pw,
database: hgh.name,
connectionLimit: 10
});
作为我模块中的全局变量。
然后我使用上面的函数从池中返回连接。
function connect() {
return pool.getConnection().then(function(connection) {
return connection
}).catch(function(error) {
console.log("Connect failed");
throw ErrorModel.generateErrorObject(error, 500);
});
}
下面是我用来查询数据库的函数:
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
不是函数。这是我的逻辑错吗?我的目标是建立一个包含大量连接(最多一定数量)的池,如果用户需要查询,getConnection()
函数只是从池中获取一个空闲连接,或者创建一个。问题是我不能为我的生活将其作为free
发回池中。每次我使用conn.end()
而不是release
发出请求时,连接仍然在{{1}我把它控制出来时池的数组,_allConnections
数组中绝对没有连接。
任何人都知道如何再次免费连接?
答案 0 :(得分:3)
查看模块的代码,我找到了从池中释放连接的功能:
pool.prototype.releaseConnection = function releaseConnection(connection) {
//Use the underlying connection from the mysql-module here:
return this.pool.releaseConnection(connection.connection);
};
因此,如果所有这些函数都存在于同一个文件中,则可以在getUser函数中执行以下操作: 取代
conn.release();
与
pool.releaseConnection(conn);
答案 1 :(得分:2)
查看代码,promise-mysql
包装原始连接对象,该对象不会公开release
方法。但是,原始文件被公开为名为connection
的属性,因此可以使用:
conn.connection.release();
一些随意的想法:
您的查询输入可能是escape:
var sql_query = `SELECT * FROM userstable WHERE userName = ${ pool.escape(username) }`;
发生错误时,您的代码不会释放连接(因为.then()
回调中的代码不会被调用);使用.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();
}
});
}