[英]node-mysql - when to release connection back into pool
我正在使用帶有連接池的node-mysql
驅動程序。
當只有一個查詢時,將連接釋放回池中很容易:
pool.getConnection(function(err, connection) {
if (err) {
throw err;
}
query = "SELECT * FROM user WHERE id = ?";
connection.query(query, [id], function(err, users) {
connection.release();
if (err) {
throw err;
}
// ...
});
});
如果我需要再次使用該連接怎么辦? 我必須將release()
向下移動幾行。 但是如果拋出錯誤會發生什么? 連接是否永遠不會返回池中?
我是否必須使用一些控制流程庫來獲得“最終”時刻才能釋放它?
有更好的想法嗎?
可以處理的一種方法是承諾。 由於您正在構建池,因此可以使用q(或本機承諾,即將推出)之類的內容構建您的請求:
// assuming you have your local getConnection above or imported
exports.getConnection = function(queryParams) {
var d = q.defer();
local.getConnection(function(err, conn) {
if(err) d.reject(err);
d.resolve(conn);
});
});
所以,將你的其他幾個調用包裝成這樣的promises,然后只編寫你的查詢:
db.getConnection()
.then(function(conn){
makeRequest()
.then(...)
...
.catch(function(err){
// at the end you release the conn
});
它看起來像你要求的東西嗎?
當您執行MySQL查詢時,它會鎖定數據庫,直到查詢完成。 成功完成查詢后,它會釋放該數據庫鎖。
同樣的情況: connection.release();
只是釋放數據庫連接,沒有別的。
您應該為該情況使用單獨的連接。 這就是連接池的用途。 這樣就不必等待另一個人在它開始之前完成。 如果一個查詢在另一個查詢完成之前無法啟動,我只使用相同的連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.