簡體   English   中英

node-mysql池活動連接未釋放?

[英]node-mysql pool active connections not getting released?

我不知道為什么,但是即使在pool.getConnection內調用connection.release() pool.getConnection ,也不行。 連接數不斷增加,而不是重用空閑連接? 有人知道我做錯了什么嗎?

我在Ubuntu上使用node-mysql(mysql@2.5.4)。

我基本上是在此測試用例中每秒調用一次pool.getConnection (模擬請求觸發池請求的Web客戶端),並在其中調用connection.release() 即使這樣,也沒有。 與服務器的連接不斷增加(我看到通過給命令watch -n 2 "netstat -an | grep 127.0.0.1.*3306.*ESTABLISHED | wc -l"作為mysql服務器是本地的),直到我遇到入enqueue事件告訴我等待連接。

這是我的測試:

/**
 * Test mysql_client (./test.js)
 */
'use strict';
var async = require('async');
var mysqlc = require('../mysql_client');
var connProp = {
        connectionLimit : 10,
        host            : 'xxx',
        user            : 'xxx',
        password        : 'xxx',
        database        : 'xxx'
};
var mydbc = new mysqlc.MySqlClient(connProp);

async.series([
    function(callback) {
        mydbc.connect(callback);
    },
    function(callback) {
        var intervalObject;
        intervalObject = setInterval(function() {
            mydbc.runQry('SELECT 1', function(err, results) {
                if (err) {
                    console.error('foo-err:', intervalObject, err);
                    callback(err);
                } else {
                    console.log('resultsxxxx', results)
                }
            })
        }, 1000*0.5)
    },
    function(callback) {
        mydbc.disconnect(callback);
    }
    ],
    function(err, results) {
        console.log('results', results[1]);
});

// This results in the following output, finally hitting enqueue event:
connecting mysql
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
resultsxxxx [ { '1': 1 } ]
running mysql qry: SELECT 1
results undefined
runQry-Waiting for available connection slot-ERROR
running mysql qry: SELECT 1
runQry-Waiting for available connection slot-ERROR
running mysql qry: SELECT 1
runQry-Waiting for available connection slot-ERROR



// This is the wrapper for node-mysql (pretty straightforward)
/**
 * mysql_client (./mysql_client.js)
 */

// Import modules
var mysql = require('mysql');
var path = require('path');
var fs = require('fs');
var async = require('async');

// Export module with Namespace
var mysqlc = exports;

// Constants
var DEFAULT_MYSQL_PORT = 3306;
var DEFAULT_AUTOCOMMIT = false;
var DEFAULT_CONNLIMIT = 10;

/**
 * MySQL Class Wrapper
 * @param {string} user: user of database account
 * @param {string} password: password for database account
 * @param {string} database: database name
 * @param {string} host: hostname of server
 * @param {string} port: port of server
 * @param {boolean} autocommit: autocommit
 * @return {object} object
 */
mysqlc.MySqlClient = function MySqlClient(connProp) {
    "use strict";
    this.user = connProp.user;
    this.password = connProp.password;
    this.database = connProp.database;
    this.host = connProp.host;
    this.port = connProp.port || DEFAULT_MYSQL_PORT;
    this.autocommit = connProp.autocommit || DEFAULT_AUTOCOMMIT;
    this.connectionLimit = connProp.connectionLimit || DEFAULT_CONNLIMIT
    this.pool = null;

    this.connProp = {
            connectionLimit : this.connectionLimit,
            host            : this.host,
            port            : this.port,
            user            : this.user,
            password        : this.password,
            database        : this.database,
            multipleStatements: true
    };
}


mysqlc.MySqlClient.prototype.runQry = function runQry(qry, args, callback) {
    console.log('running mysql qry:', qry);
    this.pool.getConnection(function(err, connection) {
        if (err) {
            console.error('runQry-cannot getConnection ERROR:', err);
            return callback(err);
        }
        connection.query(qry, args, function(err, rows) {
            if (err) {
                console.error('runQry-cannot run qry ERROR:', err);
                return callback(err);
            }
            connection.release();
            return callback(null, rows);
        });
    });
};

mysqlc.MySqlClient.prototype.connect = function connect(callback) {
    var pool = mysql.createPool(this.connProp);
    this.pool = pool;

    pool.on('enqueue', function () {
        console.error('runQry-Waiting for available connection slot-ERROR');
        return callback('pool-not-empty');
    });

    // verify connection
    pool.getConnection(function(err, connection) {
        console.log('connecting mysql');
        if (err) {
            console.error('ERROR connecting to mysql server with connProp:', this.connProp);
            return callback(err);
        }
        connection.release();
        return callback(null);
    });
};

mysqlc.MySqlClient.prototype.disconnect = function disconnect(callback) {
    var pool = this.pool;
    pool.getConnection(function(err, connection) {
        console.log('disconnecting mysql');
        if (err) {
            console.error('ERROR disconnecting to mysql server with connProp:', this.connProp);
            return callback(err);
        }
        connection.release();
        pool.end();
        return callback(null);
    });
}
   if (err) {//do this if you get err
            connection.release();
            console.error('runQry-cannot run qry ERROR:', err);
            return callback(err);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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