【问题标题】:"PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR" in Node-MySqLNode-MySqL 中的“PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR”
【发布时间】:2015-08-07 00:37:17
【问题描述】:

您好,我正在尝试编写一个 Node + Express 来提供 REST 服务。应用程序启动时一切顺利。然而,几个小时后,我得到一个错误:“code”:“PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR”,“fatal”:false。似乎有些资源快用完了。有人知道如何解决它。

这是代码的主要部分:

var mysql   = require("mysql");
var _ = require('underscore')
var Q = require("q");

function REST_ROUTER(router,connection,md5) {
    var self = this;
    self.handleRoutes(router,connection,md5);
}

var queryWithPromise = function (connection, query) {
    var deferred = Q.defer();
    connection.query(query, function(err, rows, fields) {
        if (err) {
            deferred.reject(err);
        };
        if (!rows||(rows.length === 0)) {
          deferred.reject("No record!");  
        }
        deferred.resolve(rows);
    });
    return deferred.promise;    
};


REST_ROUTER.prototype.handleRoutes = function(router,connection,md5) {
    var self = this;
    router.get("/",function(req,res){
        res.json({"Message" : "Hello World !"});
    });
    router.get("/data/:token/:latlng",function(req,res){
        //console.log(req.params.token);
        query = mysql.format("SELECT * FROM TOKEN WHERE token=?",[req.params.token]);
        queryWithPromise(connection, query).then(function (tokens) {
            var latlngs = req.params.latlng.split(',');
            var lat = parseFloat(latlngs[0]);
            var lng = parseFloat(latlngs[1]);
            var queryLatLng = mysql.format("SELECT * FROM device WHERE longitude > ? AND longitude < ? AND latitude > ? AND latitude < ?", [lng-0.1, lng+0.1, lat-0.1, lat+0.1]);
            return queryWithPromise(connection, queryLatLng);
        }).then(function (devices) {
            var latlngs = req.params.latlng.split(',');
            var computeDistance = function (fromLatlng, toLatlng) {
                var toRad = function (degree) {
                    return degree * Math.PI / 180;
                };                
                var EARTH_RADIUS = 6378137; // in meter
                var lat1 = toRad(fromLatlng.lat);
                var lng1 = toRad(fromLatlng.lng);
                var lat2 = toRad(toLatlng.lat);
                var lng2 = toRad(toLatlng.lng);
                var d = EARTH_RADIUS*Math.acos(Math.sin(lat1)*Math.sin(lat2) + Math.cos(lat1)*Math.cos(lat2)*Math.cos(lng1 - lng2));
                return d;
            };
            var closestDevice = _.min(devices, function(device) {
                return computeDistance({lat: parseFloat(latlngs[0]), lng: parseFloat(latlngs[1])}, {lat: device.latitude, lng: device.longitude});
            });
            var queryDevice = mysql.format("SELECT * FROM ?? ORDER BY UploadTime DESC LIMIT 100", [closestDevice.device_id]);
            return queryWithPromise(connection, queryDevice);
        }).then(function (data) {
            var latlngs = req.params.latlng.split(',');            
            res.json({
                "latitude": parseFloat(latlngs[0]),
                "longitude": parseFloat(latlngs[1]),
                "timezone": "Asia/Shanghai",
                "offset": 8,
                 "hourly": {
                    "data": _.map(data, function(item) {
                        return {
                            "time": item.UploadTime.getTime()/1000, 
                            "precipIntensity": item.rainfall,
                            "temperature": item.airtemp,
                            "humidity": item.airhumidity,
                            "windSpeed": item.windspeed,
                            "windBearing": item.winddirection,
                            "pressure": item.atmosphericpressure,
                            "soiltemp": item.soiltemp,
                            "soilhumidity": item.soilhumidity
                        };
                    })
                 }
            });
        }).catch(function (error) {
            res.json({"Error" : true, "Message" : "Success", "Data" : error});
        })
        .done();
    });
}

module.exports = REST_ROUTER;

【问题讨论】:

  • 我也遇到了同样的问题。你有没有找到解决这个问题的方法?
  • 2019 我也遇到了同样的问题。有什么修复方法吗?

标签: mysql node.js rest express


【解决方案1】:

根据我的经验,该问题是由于直接创建连接(使用 mysqljs/mysql 库,取消 createConnection()而不是使用允许运行 query() 并释放执行后自动连接(执行getConnection() + query() + release())。

如果没有释放连接,并且在下一次尝试查询时,就会发生致命错误。

Pooling Connections

【讨论】:

    【解决方案2】:

    在我的 Ubuntu 中,我发现数据库在上午 10:02 从 mysql 日志中完全损坏。正是在此错误消息开始的同时。所以我重新启动了Ubuntu。

    重启后还是报同样的错误。大约在 mysql 服务器“准备好”时它开始工作。也许 mysqld 需要几秒钟来解决崩溃或数据库损坏问题。

    【讨论】:

      【解决方案3】:

      我在我的应用程序中也遇到了这个错误,并最终提高了 MySQL 的可用内存量来修复它。 How to set memory limit in my.cnf file

      这很可能与大量事务和内存不足有关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多