node-mysql不重用连接

时间:2014-11-05 15:27:21

标签: 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 = 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();替换为connection.destroy();,但效果不佳。 我该如何解决这个问题?


node-mysql版本:

"mysql": "~2.5.1",

顺便说一下。我跟踪创建的连接:

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

1 个答案:

答案 0 :(得分:1)

无论我改变了什么,在我转而使用" express-myconnection"作为中间件(如此处所述:http://teknosains.com/i/simple-crud-nodejs-mysql)。

简而言之:您从request获得连接,之后不需要释放它,因为中间件会关注它。

所以,我的代码现在(只是重要的部分):

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;
      });
    }
  });
};