Node Mysql查询队列但从不执行

时间:2015-12-23 22:30:56

标签: javascript mysql node.js

我遍历一些目录,然后是其中的文件。我按目录处理文件,然后尝试将处理后的结果添加到MySQL中。 我打电话给conn.query(' INSERT QUERY HERE')它似乎继续,但查询永远不会在服务器上运行。如果我告诉它只处理一个目录并等到最后它将运行查询但我不能继续将所有查询存储在内存中,直到脚本或节点的结尾因mem而失败帽。我已经尝试了一切我能想到的尝试强制排队的查询运行但没有运气。

以下是我的代码

的示例
// ... etc
// ...
void main(void)
{
    Parser* p = new Parser();
    p->parse();

    afterfinish(); 
}

代码将继续循环遍历目录,而无需将查询发送到mysql。我知道它可以通过将代码限制为仅在一个目录上运行来工作,并且一旦处理完一个目录就会查询,但如果我让它在所有目录上运行则不会。

我已经尝试过使用mysql池,但没有运气。该 dirs.forEach(function(dir){ var data = []; var connection = mysql.createConnection(conConfig); files.forEach(function(file){ //do some processing on files push into data array //creating array of objects }); data.forEach(function(record){ connection.query('INSERT INTO TABLE SET ?', record); }); connection.end(); }); 会触发但不会将其发送到服务器。

编辑: 所以我尝试用bash中的for循环调用脚本来单独调用每个目录名称并加载所有记录。对于为什么在我的orig示例中永远不会建立mysql连接,我傻眼了。

2 个答案:

答案 0 :(得分:0)

Javascript异步调用mysql查询。这意味着在完成所有插入查询之前,可能会关闭连接。

您可以使用查询功能提供的回调:

var qCnt = array.length;
var connection = mysql.createConnection(conConfig);
connection.connect();
array.forEach(function(record){
  connection.query('INSERT INTO TABLE SET ?', record, function(err){
     if (err) throw err;

     qCnt--;
     if (qCnt == 0){
          connection.end();
     }
  });
});

此解决方案并不理想,因为无论您的数据库连接限制如何,都会触发所有插入查询。您可能只想在前者完成后触发下一个插入。这也是一些技巧。

答案 1 :(得分:0)

实际上这是一个异步问题。似乎没有任何方法可以在不停止当前正在运行的进程的情况下强制执行排队查询。我必须使用异步模块才能使我的代码正常工作。

@luksch connection.end()在完成所有排队查询之前不会关闭连接。我确实使用他的迭代方法进行回调。

我是这样做的。

var async = require('async');
var connection = mysql.createConnection(conConfig);
var dirs = fs.readdirSync('./rootdirectory');

async.eachSeries(dirs,function(dir,callback){
  var data = [];
  files.forEach(function(file){
    //do some processing on files push into data array 
    //creating array of objects
  });
  var qCount = data.length;
  data.forEach(function(record){
    connection.query('INSERT INTO TABLE SET ?', record, function(err){
      if (err) throw err;
      qCount--
      if(qCount === 0) { callback(true); }
    });
  });
  function(){ connection.end(); }
});

这将迭代目录并对所有查询进行排队,然后强制运行查询,直到所有目录都被处理完毕,然后调用最终函数关闭连接。