Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点mysql不';不要重复使用连接_Node.js_Node Mysql - Fatal编程技术网

Node.js 节点mysql不';不要重复使用连接

Node.js 节点mysql不';不要重复使用连接,node.js,node-mysql,Node.js,Node Mysql,我以以下方式使用连接池: var pool = mysql.createPool({ host: config.db.host, port: config.db.port, user: config.db.user, password: config.db.password, database: config.db.database, connectionLimit: config.db.connectionLimit }); exports.api_point = f

我以以下方式使用连接池:

var pool = mysql.createPool({
  host: config.db.host,
  port: config.db.port,
  user: config.db.user,
  password: config.db.password,
  database: config.db.database,
  connectionLimit: config.db.connectionLimit
});

exports.api_point = function(req, res) {

  pool.getConnection(function(err, connection) {
    if (err) {
      console.error('error acquiring connection', err);

      var result = {};
      result.error = err.code;

      res.json(result);
      return;
    } else {
      var query = connection.query('SELECT * FROM tableName', function(err, rows) {
        connection.release();

        var result = {};

        if (err) {
          console.error('error executing query: ' + err.stack);

          result.error = err.message;
        } else {
          result.data = rows;
        }

        res.json(result);
        return;
      });
    }
  });
};
问题: 但是,在创建了所有连接(由connectionLimit定义,例如20)之后,对
pool.getConnection()
的下一个调用将挂起,直到Express返回:“GET/api_point--ms--”(大约10秒后)

我已尝试替换
connection.release()
连接。销毁()无效。
我怎样才能解决这个问题


节点mysql版本:

"mysql": "~2.5.1",
顺便说一句,我跟踪正在创建的连接:

var connCount = 0;
pool.on('connection', function(connection) {
  console.log('connCount:', ++connCount);
});

无论我做了什么更改,在我切换到使用“ExpressMyConnection”作为中间件(如下所述)之前,一切似乎都不起作用

简而言之:您可以从
请求中获得连接,之后无需释放它,因为中间件关心这一点

因此,我的代码现在是(仅重要部分):

app.js:

var myconnection = require('express-myconnection');
var mysql = require('mysql');

app.use(
  myconnection(mysql, {
    host: config.db.host,
    port: config.db.port,
    user: config.db.user,
    password: config.db.password,
    database: config.db.database,
    connectionLimit: config.db.connectionLimit
  }, 'request')
);
api.js:

exports.api_point = function(req, res) {

  req.getConnection(function(err, connection) {
    if (err) {
      console.error('error acquiring connection', err);

      var result = {};
      result.error = err.code;

      res.json(result);
      return;
    } else {
      var query = connection.query('SELECT * FROM tableName', function(err, rows) {
        var result = {};

        if (err) {
          console.error('error executing query: ' + err.stack);

          result.error = err.message;
        } else {
          result.data = rows;
        }

        res.json(result);
        return;
      });
    }
  });
};

只需要connection.release()即可。如果您试图在释放前一个连接之前请求一个新连接,则将建立一个新连接,否则,它将重用已释放的连接。你确定你不仅仅是发送请求太快了吗?如果您同时发送21个请求,则第21个请求将挂起。@KevinB,这就是文档所说的和我所做的。既然这不起作用,那就是我为什么在这里寻求帮助…Np。在我启动另一个请求之前,请求完成(并返回响应)。您能显示该代码吗?困扰我的是,在第20次请求之后,getConnection并没有无限期地挂起。如果它停止“挂起”,那么很明显,您在上一个请求完成之前发送了它,并且它们在某个时候会被释放。我通过jquery.ajax(从web应用程序)访问此api,因此只有当我在网页/日志上看到上一个请求的响应时,我才会启动另一个请求。