【问题标题】:Can't close mysql connection with NodeJS无法关闭与 NodeJS 的 mysql 连接
【发布时间】:2016-09-23 01:25:17
【问题描述】:

这真的很烦人,我只是无法关闭我的 mysql 连接。这是我的代码:

var mysql = require('mysql');

function getConnection(){
    return mysql.createConnection({
        host     : credentials.db.host,  //'eu-cdbr-azure-north-e.cloudapp.net',
        user     : credentials.db.user,     //'b1a8cac71bbac61',
        password : credentials.db.password,     //'be2de8334',
        database : credentials.db.database     //'bcd290081'
    });
}

function runMySQLQuery(qry, callback){
    var conn = getConnection();
    conn.connect();
    conn.query(qry, function(err, rows, fields) {
        if (err){
            // db err
            callback(Error.sql_query, null);
        } else{
            // check result
            if(typeof rows == 'object'){
                callback(Error.no_errors, rows);
            }else{
                // wrong return from db
                callback(Error.sql_query, null);
            }
        }

    });
    //conn.destroy();
    conn.end(function(err) {
        // The connection is terminated now 
        console.log('connection ended');
    });
}

var qry = "SELECT id, hash, last_login FROM acsm_b962fe317b5d30e.orium_chatbot_customers " +
            "WHERE username = '" + username + "' AND password = '" + password + "';"
//console.log('qry', qry);
runMySQLQuery(qry, callback);

所以,我正在接收我想要的数据,但连接保持打开状态,我尝试了 destroy 和 end 方法(有和没有回调函数),我的程序只是没有结束。大概一分钟左右,终于结束了,然后调用了end的回调函数。

真的很烦人,我还看到另一个stackoverflow doubt 对此也不太成功。

关闭连接对我来说非常重要,因为我想在 AWS Lambda 上部署我的代码,我无法承受这么长时间。

【问题讨论】:

  • 您希望它关闭的时间是什么时候?
  • 在我的查询执行后,你会看到我调用了回调,然后调用了 conn.end
  • 尝试 connection.on('error', function(error) { console.log(error); });
  • 我在 conn.end 之前添加了这段代码,没有打印任何新内容。

标签: mysql node.js node-mysql


【解决方案1】:

使用此代码释放mysql连接

1) conn.release();

2) conn.destroy();

【讨论】:

  • 嘿伙计,不幸的是,这不起作用,因为它不是池,所以它不是可用的方法,我之前尝试过销毁,它仍然没有关闭连接:(
【解决方案2】:

我最终自己找到了解决方案。这确实是一个糟糕的猜测,但它奏效了。我不确定 node-mysql 是否应该像这样工作,但我只需要向函数 runMySQLQuery 添加一些代码:

function runMySQLQuery(qry, callback){
    var conn = getConnection();
    conn.connect();
    conn.query(qry, function(err, rows, fields) {
        if (err) {
            return conn.rollback(function() {
                console.log(JSON.stringify(err));
                throw Error.sql_query;
            });
        }  
        conn.commit(function(err) {
            if (err) {
                return conn.rollback(function() {
                    throw Error.sql_commit;
                });
            }
            conn.destroy();
            callback(Error.no_errors, rows);
        });
    });
}

事实证明,在调用 commit 之后调用 destroy 实际上结束了连接。同样,仅调用 destroy 或 end 对我不起作用。

【讨论】:

  • connect() 是异步的,对吧?查询是否在执行前等待连接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多