如何在nodejs中自动关闭mysql连接

时间:2014-06-23 14:45:59

标签: node.js node-mysql

目前我的进程正在挂起,因为mysql池没有自动关闭。

我认为当我调用connection.release()时,如果没有人使用它,连接将会关闭。但似乎并非如此。我的代码如下:

getConnection.js:

var mysql = require('mysql');

var pool = mysql.createPool({
  connectionLimit : 10,
  host     : 'localhost',
  user     : 'root',
  password : 'mysql',
  database : 'xxx'
});

module.exports = function getConnection(callback){
    pool.getConnection(function(err, connection){
        if (err) {
            throw err;
        }
        callback(connection);
    });
}

我正在使用它:

var getConn = require('./getConnection');

function selectOne(query, map, cb){

    getConn(function(conn){
        conn.query(query, map, function(err, rows){
            if (err) {
                throw err;
            }

            cb(rows.length ? rows[0] : false);
            conn.release();
        });
    });
}

我想我错过了什么。当我发布它时,node-mysql不应该为我关闭连接吗?

3 个答案:

答案 0 :(得分:3)

https://github.com/felixge/node-mysql#pooling-connections conn.release();允许将连接释放到连接池,因此不会将其关闭。如果要根据文档https://github.com/felixge/node-mysql#terminating-connections使用conn.end();来关闭连接。

答案 1 :(得分:2)

我采取了与Ishaan类似的方法,但我认为我的理解有点清晰。

这是我的代码片段。

// Dependencies
var mysql   = require('mysql'),
    config  = require("../config");

/*
 * @sqlConnection
 * Creates the connection, makes the query and close it to avoid concurrency conflicts.
 */
var sqlConnection = function sqlConnection(sql, values, next) {

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

    var connection = mysql.createConnection(config.db);
    connection.connect(function(err) {
        if (err !== null) {
            console.log("[MYSQL] Error connecting to mysql:" + err+'\n');
        }
    });

    connection.query(sql, values, function(err) {

        connection.end(); // close the connection

        if (err) {
            throw err;
        }

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

    });
}

module.exports = sqlConnection;

比你可以在任何地方使用它

var mysql_query = require('../models/mysql_query');
mysql_query('SELECT * from your_table where ?', {id: '1'}, function(err, rows)   {
    console.log(rows);
});

希望这有帮助。

答案 2 :(得分:-1)

我在这里很新,请原谅我,如果我错了。

这就是我这样做的方式

module.exports = {
      getDBConnection: function () {
        return mysql.createConnection(config.db);
      },

       connectToDB: function (connection) {
            connection.connect(function (err) {
                   if (err) {
                            throw err;
                    }
                    });
       },

      endDBConnection: function (connection) {
        connection.end(function (err) {
          if (err) {
            throw err;
          }
        });
      },

      exec: function (query, data, cb) {
        var connection = this.getDBConnection();
        this.connectToDB(connection);
        connection.query(query, data, function(err, res) {
          if (err) {
            cb(err);
          }
          cb(null, res);
        });
        this.endDBConnection(connection);
      }
}

这是配置变量

 db: {
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'test'
},