如何结束 mysql 连接而不让它挂在 NodeJS 中?

Posted

技术标签:

【中文标题】如何结束 mysql 连接而不让它挂在 NodeJS 中?【英文标题】:How to end a mysql connection and not let it hang in NodeJS? 【发布时间】:2014-04-25 01:56:59 【问题描述】:

我正在尝试在我的节点程序中结束我的 mysql 连接。我可以使用 connection.end() 之类的方法成功地做到这一点。但是,当我这样做时,它似乎没有在那之前运行查询。如果我在它似乎运行之前将 end 语句排除在我的插入查询之外,那么程序就会挂起并且它永远不会结束。

这是我的代码

var mysql      = require('mysql');

var connection = mysql.createConnection('...');

 connection.connect(function(err)

 );

        for(var a=0; a<ticker.length;a++)
            if(result[i].tweetText.indexOf(ticker[a]) > -1)
                for(var j=0; j<positive.length;j++)
                    if((result[i].tweetText.indexOf(positive[j]) > -1) && check > -1)
                        console.log(result[i].tweetText + "\n")
                        plus++;
                        console.log(ticker[a] + "plus"+plus +"\n")
                        check = -1;
                        connection.query("insert into....", function(err, result) 
                        );
                    
                


            
        

   connection.end();

结束成功终止连接,但是我的所有插入语句都没有运行;当我删除结束连接语句时,我的插入语句运行但程序挂起。

【问题讨论】:

【参考方案1】:

你可以像我一样使用 mysql pool。将您的连接设置存储在一个对象中,使用您的配置变量创建池,然后随意传递con,然后只需获取连接,查询您的数据库,它就会为您处理一切。没有挂断。

var db_config = 
    user:"",
    password:"",
    database:"",
    port:80
;

var con = mysql.createPool(db_config);

然后使用getConnection函数打开和释放连接。

con.getConnection(function(err)
    con.query("SELECT * FROM tableName",function(err,result) 

    );
);

您可以通过github mysql source 阅读有关pool 连接的更多信息

【讨论】:

这行得通,但现在我的变量丢失并且未定义。我不明白为什么 mysql 语句在整个循环完成后运行;到那时我的变量已经丢失并且被插入为未定义的。 由于某种原因,当我使用 connection.release() 时,它仍然没有结束程序。 Connection.destroy() 结束了它,但是我再次遇到了同样的问题,即我的查询语句没有运行。我很困惑为什么我的查询在所有处理之后运行,而不是在 for 循环中执行时运行。 @Faran 您需要像函数参数一样传递变量,否则它们将失去作用域。您无需使用连接池调用release()destroy() 包含一个使用 con.release() 的例子怎么样?【参考方案2】:

根据你使用conn.query时的文档,连接会自动打开,所以你不需要

connection.connect(function(err)

);

回答您的问题,问题是因为当您插入数据库时​​,节点不会等待并继续循环。您可以将数据推送到数组中,然后在循环之后插入批量数据。像这样:

How do I do a bulk insert in mySQL using node.js

var bulk = data; // 

connection.query("insert into table (columns) values ?", bulk, function(err, result) 
    connection.destroy();
);

【讨论】:

..您确实意识到您正在破坏池与该代码的连接对吗?

以上是关于如何结束 mysql 连接而不让它挂在 NodeJS 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 GetQueuedCompletionStatus() 立即返回?

Git挂在状态添加提交

MySQL:非常慢的更新/插入/删除查询挂在“查询结束”步骤

Java 挂在 foreach 循环上

NodeJ node.js Jquery Ajax 跨域请求

与 Sql 服务器的连接挂在 con.Open() [重复]