如何结束 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() 立即返回?
MySQL:非常慢的更新/插入/删除查询挂在“查询结束”步骤