【问题标题】:Error: Cannot enqueue Query after fatal error in mysql node错误:在 mysql 节点中出现致命错误后无法排队查询
【发布时间】:2016-10-03 20:24:51
【问题描述】:

我正在使用 felixge/node-mysql。另外我正在使用 express-myconnection 来防止 mysql 超时,从而防止节点服务器被杀死。我正在做的是在 mysql 中记录活动。场景是我有一个文件上传功能,一旦文件上传,我正在对文件执行不同的操作。在处理的每个阶段,我都将这些活动记录在数据库中。如果文件很小,这可以正常工作。如果文件很大,比如 100 MB,则加载需要一些时间,因此在此期间 mysql 服务器重新连接并创建新连接,但日志记录代码仍使用旧引用。错误:致命错误后无法将查询排入队列。所以,我的问题是有没有一种方法可以使用新的连接引用而不是旧的连接引用。有一个单一的功能,其中有关文件活动的所有不同阶段都发生。任何帮助是极大的赞赏。谢谢

嗨@paul,如果你看到了要点链接,你可以看到我有 upload.on('begin', function (fileInfo, reqs, resp) { } 我记录了文件上传过程的活动开始。上传文件后,upload.on('end', function (fileInfo,request,response) { } 被触发。我也在此处记录一些活动。正如我在问题中所说,如果文件很大,则上传需要时间。同时创建了一个新的 MySql 连接,但“end”事件中的插入查询仍然引用旧的 myconnection。所以,我想知道在这种情况下如何使用新的 mysql 连接引用?我希望这更好地解释了这个场景。

【问题讨论】:

  • 请显示一些代码。
  • 请检查链接gist.github.com/anonymous/ac4310635d6087cc6fe98d2cc27e27d9 第一个插入在上传过程开始时起作用。但是第二次insert是在上传过程完成的时候才开始的。这里还是引用mysql进程的老引用。
  • 我还是不明白你的问题。您应该为每个工作单元使用不同的连接。不要依赖在特定时间范围内发出您的事件。
  • 嗨@paul,我已经解释了上面有问题的场景。请看一下。
  • 对不起,这对我来说仍然没有意义。从您的要点来看,您似乎正在使用 express-myconnection 中的“池”选项。鉴于您每次要进行查询时(在开始和结束步骤中)都要求该中间件为您提供连接,您应该依靠它从其池中为您管理连接,而不用担心是否连接是否“相同”。

标签: mysql node.js


【解决方案1】:

实际上,我决定为您搜索您的错误,并在阅读此线程后:https://github.com/felixge/node-mysql/issues/832 我意识到您在第一个查询完成后没有释放连接,因此池永远不会尝试向您发出新的一。您是正确的,陈旧的连接可能是问题所在。如果是这样,您可以通过以下方式解决:

upload.on('begin', function (fileInfo, reqs, resp) { 
    var fileType = resp.req.fields.file_type;
    var originalFileName = fileInfo.name;
     var renamedFilename = file.fileRename(fileInfo,fileType);
    /*renaming the file */
    fileInfo.name = renamedFilename;

    /*start: log the details in database;*/
    var utcMoment = conf.moment.utc();
    var UtcSCPDateTime = new Date( utcMoment.format() );
    var activityData = {
        activity_type     : conf.LIST_UPLOAD_BEGIN,
        username          : test ,
        message           : 'test has started the upload process for the file',
        activity_datetime : UtcSCPDateTime 
    };
    reqs.params.activityData = activityData;
    req.getConnection(function(err,connection) {
    var dbData = req.params.activityData;
    var activity_type = dbData.activity_type;
    console.dir("[ Connection ID:- ] "+connection.threadId+' ] [ Activity type:- ] '+activity_type);
    var insertQuery = connection.query("INSERT INTO tblListmanagerActivityLog SET ? ",dbData, function(err, result) {
        if (err) {
            console.log("Error inserting while performing insert for activity "+activity_type+" : %s ",err );
        } else {
            console.log('Insert successfull');
        }
        /// Here is the change:
        connection.release();
    });

});
    /*end: log the details in database;*/
});

【讨论】:

  • 嗨@paul 我添加了connection.release();但它仍然使用旧的参考。 '[连接ID:-]1110][活动类型:-]列表上传开始'插入成功'[连接ID:-]1110][活动类型:-]列表上传完成''[连接ID:-]1110][活动类型:- ] List Copy' Error inserting while execution insert for activity List Upload Complete : Error: Cannot enqueue Query after fatal error.
  • 嗨@paul,似乎 express-myconnection 模块有一些问题。我将池选项更改为单个,它似乎也适用于 90MB 文件。我会用一些更大的文件再次测试它。感谢所有帮助。
  • 很高兴我能帮上忙,不管多小。我要提到我从未使用过那个特定的模块,而且我认识的大多数人都倾向于管理他们自己的连接(通过为每个请求创建一个新的连接或显式地从池中提取/释放)。
  • 为了使池连接正常工作,我们需要注释掉 github.com/pwalczyszyn/express-myconnection/blob/master/lib/… 这一行。希望它可以帮助任何面临同样问题的人。
  • @RahulSingh,您应该 a) 用它回答您自己的问题(让其他人更容易找到)并 b) 向模块所有者提交拉取请求以修复它。查看您引用的代码,它看起来像是对池的直接错误实现。
【解决方案2】:

为了使池连接正常工作,我们需要注释掉 https://github.com/pwalczyszyn/express-myconnection/blob/master/lib/express-myconnection.js#L84 这一行。希望对遇到同样问题的人有所帮助。

我们也可以使用单连接选项。

【讨论】:

    【解决方案3】:

    我有同样的问题。遇到一个解决方案 -

    重新安装 MySQl,同时在配置步骤中,选择“legacy encryption”选项并完成安装。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2019-03-17
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      相关资源
      最近更新 更多