簡體   English   中英

node-mysql - 何時將連接釋放回池中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM