2014-03-19 17 views
2

我想在我的节点程序中结束我的mysql连接。我可以使用connection.end()这样的东西成功地做到这一点。但是,当我这样做时,它似乎并没有在这之前运行查询。如果我在这似乎运行之前将结束语句放出我的插入查询,但是程序然后挂起并且它永远不会结束。如何结束一个mysql连接并且不让它在NodeJS中挂起?

这里是我的代码

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(); 

具有最终成功终止连接,但后来我所有的INSERT语句不运行;当我删除结束连接语句时,我的插入语句运行,但程序挂起。

回答

3

你可以做我所做的和使用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) { 

    }); 
}); 

当您使用conn.query您可以阅读通过github mysql source

+0

这工作,但现在我的变量都将丢失,并提出为未定义。我没有得到的是为什么在整个循环完成后mysql语句正在运行;那么我的变量就会丢失,并被插入为未定义的。 – Faran

+0

由于某些原因,当我使用connection.release()时,它仍然不会结束程序。 Connection.destroy()结束它,但我有我的查询语句不运行的同样的问题。我很困惑,为什么我的查询在所有处理之后运行,并且在执行for循环时未运行。 – Faran

+0

@Faran你需要传递你的变量,如函数参数,否则它们将失去它们的范围。你不需要使用连接池 –

0

更多关于pool连接与文件根据,连接会自动打开,这样你就不需要

connection.connect(function(err){ 

}); 

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

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(); 
}); 
+0

调用'release()'或者destroy()',并且你意识到你正在销毁该池与该代码的连接吗? –

相关问题