【问题标题】:NodeJS Mysql - Connection not being releasedNodeJS Mysql - 连接未释放
【发布时间】:2020-05-16 19:19:43
【问题描述】:

似乎 MySQL 池没有从我的 NodeJS 应用程序释放连接。从 mysql 查看服务器进程时,连接已建立但未释放。

应用程序崩溃并出现以下错误:TypeError: Cannot read property 'query' of undefined。据我了解,这是因为我超出了连接限制。

请注意,我使用的是 Heroku MySQL 插件,并且测试连接数限制为 10 个。我已将 connectionLimit 添加到 .env DB_URL 的末尾,以尝试限制池中的连接。

在我的 .env 文件中,链接的格式如下: DEV_DB_URL=mysql://user:pass@host:3306/db_name?connectionLimit=5 db.js 文件:

var mysql = require('mysql');
var dbURL = process.env.PRODUCTION === 'true'
  ? process.env.LIVE_DB_URL
  : process.env.DEV_DB_URL;

var dbConnection = function dbConnection( sql, values, next){

  // It means that the values hasn't been passed
  if (arguments.length === 2){
    next = values;
    values = null;
  }

  var pool = mysql.createPool(dbURL);
  pool.getConnection(function(err, connection){
    connection.query(sql, values, function(err) {

      connection.release();

      if (err) {
        throw err;
      }

      // Execute the callback
      next.apply(this, arguments);
    });
  });
};


module.exports = dbConnection;

我使用 db.js 文件的控制器如下所示:

var DB = require('../services/db');
exports.updateReporting = function(req, res){
  var body = req.body;
  var sentStatus = body.edc;


  if( sentStatus === 'pass'){
    res.status(200)
      .send({
        message: 'EDC is all good.'
      })
  }


  if( sentStatus === 'fail'){
    var dateTime = require('node-datetime');
    var dt = dateTime.create();
    var curTimestamp = dt.format('Y-m-d H:M:S');

    var storeId = body.store_id
      .substring('Addr1='.length);
    var fileTimestamp = body.file_ts;

    var data = {
      status: sentStatus,
      store_id: storeId,
      file_ts: fileTimestamp,
      current_ts: curTimestamp
    };


    DB('INSERT INTO edc_reporting SET ?', data, function( err, row ){
      if (err) throw err;
    });

    res.status(200)
      .send({
        message: 'Message recorded.'
      })
  }

};

由于我是 Node 新手,我不确定我的 connection.release() 是否在错误的位置并且因为回调而没有执行?

任何指针将不胜感激。

【问题讨论】:

    标签: mysql node.js heroku


    【解决方案1】:

    这真是个愚蠢的错误。

    db.js 文件中,我有var pool = mysql.createPool(dbURL); inside 导出的函数;这是错误的。

    每次有请求时,都会重新创建连接并启动新池。为了解决这个问题,我将池的创建移到了 dbConnection 函数之外,因此只创建了 1 个池并开始了连接。

    【讨论】:

      【解决方案2】:

      尽管在导出函数之外声明了池并使用 connection.release() 释放连接,但它对我不起作用。使用 pool.query 而不是 connection.query 工作得很好,它每次都会自动释放连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2019-12-03
        • 2018-03-19
        • 2014-08-06
        • 2020-02-24
        • 2014-02-07
        • 1970-01-01
        相关资源
        最近更新 更多